Session 的存储方式

在 php.ini 文件中,进行配置。

涉及配置参数

 - session.save_handler

 - session.save_path

注意:这两个参数可以在 PHP 中通过 ini_set 来设置,不用直接覆盖原 php.ini 中的值。

一、文件存储

session.save_handler = files

session.save_path = "N;MODE;/path"

注释:N 表示多级目录,值为数字。MODE 表示创建的 Session 文件权限。/path 表示 Session 存储路径。

这里我设置

session.save_path = "2;600;/tmp/"

重启PHP-FPM,然后写个测试脚本 test.php,代码里运行 session_start();

结果报错

PHP Warning:  session_start(): open(/tmp/h/p/sess_hpbfs95c9omtfn30h5lt43i597, O_RDWR) failed: No such file or directory

为什么呢?

我们来看下PHP官网怎么说的吧

此指令还有一个可选的 N 参数来决定会话文件分布的目录深度。例如,设定为 '5;/tmp' 将使创建的会话文件和路径类似于 /tmp/4/b/1/e/3/sess_4b1e384ad74619bd212e236e52a5a174If。

要使用 N 参数,必须在使用前先创建好这些目录。

在 ext/session 目录下有个小的 shell 脚本名叫 mod_files.sh,windows 版本是 mod_files.bat 可以用来做这件事。

此外注意如果使用了 N 参数并且大于 0,那么将不会执行自动垃圾回收,更多信息见 php.ini。

另外如果用了 N 参数,要确保将 session.save_path 的值用双引号 "quotes" 括起来,因为分隔符分号( ;)在 php.ini 中也是注释符号。

文件储存模块默认使用 mode 600 创建文件。通过 修改可选参数 MODE 来改变这种默认行为: N;MODE;/path ,其中 MODE 是 mode 的八进制表示。 MODE 设置不影响进程的掩码(umask)。

Caution:使用以上描述的可选目录层级参数 N 时请注意,对于绝大多数站点,大于1或者2的值会不太合适——因为这需要创建大量的目录:例如,值设置为 3 需要在文件系统上创建 64^3 个目录,将浪费很多空间和 inode。仅仅在绝对肯定站点足够大时,才可以设置 N 大于2。

了解这些,我们就开始处理 Session 存储目录的创建了,注意子目录的权限问题。

bash /path/to/mod_files.sh

使用多级目录的后果就是,你必须手动清理这些 Session。

二、Redis

首先你得安装了 Redis 扩展

session.save_handler = redis

//多节点
session.save_path = "tcp://ip:port?auth=secret?weight=1&timeout=2.5,tcp://ip2:port2?weight=2" //单个节点
session.save_path = "tcp://ip:port?auth=secret?weight=1&timeout=2.5" //socket 方式
session.save_path = "unix:///var/run/redis/redis.sock?persistent=1&weight=1&database=0

解释一下,涉及参数的含义:

ip: Redis 节点的 IP。

port: Redis 节点的端口。

auth: 与 Redis 节点进行权限验证。

weight: 权重,上面的例子表示session数量,ip2节点 是 ip1节点的两倍。

timeout: Redis 连接超时时间。单位:秒。连接失败时,Session不可用(风险!)

persistent: 持久连接。

prefix: 前缀,默认是 "PHPREDIS_SESSION:"。

database: 选择哪个 Redis 数据库。取值:int。参见 Redis 配置 databases 16。

重启PHP-FPM,然后写个测试脚本 test.php,代码里运行 session_start();

我们看看效果

redis-cli

127.0.0.1:6379> KEYS *
1) "PHPREDIS_SESSION:fi08i7ms4rtrdsb6n1oqb0fek2" 127.0.0.1:6379> TYPE "PHPREDIS_SESSION:fi08i7ms4rtrdsb6n1oqb0fek2"
string 127.0.0.1:6379> get "PHPREDIS_SESSION:fi08i7ms4rtrdsb6n1oqb0fek2"
"admin_user|a:3:{s:8:\"username\";s:4:\"test\";s:4:\"name\";s:4:\"test";s:5:\"email\";s:12:\"test@test.cn\";}" 127.0.0.1:6379> ttl "PHPREDIS_SESSION:fi08i7ms4rtrdsb6n1oqb0fek2"
(integer) 292

可以看到 Session 存入了 Redis 中,数据结构用的是 String。

Session 的过期时间

使用 php.ini 中的 session.gc_maxlifetime

可以通过 ini_set 在 php 中自定义。

多机房的 Redis 存储怎么弄?

同步呗!

session 存储方式的更多相关文章

  1. 分布式集群下的Session存储方式窥探

    传统的应用服务器,自身实现的session管理是大多是基于单机的,对于大型分布式网站来说,支撑其业务的远远不止一台服务器,而是一个分布式集群,请求在不同的服务器之间跳转.那么,如何保持服务器之前的se ...

  2. PHP 更改session存储方式为Redis

    前言: 服务器默认的session存放方式是file.当客户端发送请求带有PHPSESSID时是顺序的去比对session存储文件,如果有5000个session文件,那就有可能需要比对4998次那么 ...

  3. 几种session存储方式比较

    原文: http://blog.sina.com.cn/s/blog_495697e6010143tj.html 集群中session安全和同步是个最大的问题,下面是我收集到的几种session同步的 ...

  4. Session 知识点再整理(二) 自定义 Session 存储机制

    对于访问量大的网站,用默认的 Session 存储方式(以文件存储)不适合,因为文件的 I/O 开销会非常大,另外 Session 机制本身使 Session 不能跨机访问,在 Web 集群中无法达到 ...

  5. 将 flask 中的 session 存储到 SQLite 数据库中

    将 flask 中的 session 存储到 SQLite 数据库中 使用 flask 构建服务器后端时,常需要在浏览器端存储 cookie 用于识别不同用户,根据不同的 cookie 判断出当前请求 ...

  6. session的存储方式和配置

    Session又称为会话状态,是Web系统中最常用的状态,用于维护和当前浏览器实例相关的一些信息.我们控制用户去权限中经常用到Session来存储用户状态,这篇文章会讲下Session的存储方式.在w ...

  7. Spring session(redis存储方式)监听导致创建大量redisMessageListenerContailner-X线程

    待解决的问题 Spring session(redis存储方式)监听导致创建大量redisMessageListenerContailner-X线程 解决办法 为spring session添加spr ...

  8. web 存储方式汇总:Cookies,Session, Web SQL; Web Storage(LocalStorage ,SessionStorage),IndexedDB,Application Cache,Cache Storage

    1 1 1 web 存储方式汇总: 旧的方式: Cookies; Session; Web SQL; 新的方式 HTML5 : Web Storage(LocalStorage ,SessionSto ...

  9. 【ASP.NET Core】自定义Session的存储方式

    在开始今天的表演之前,老周先跟大伙伴们说一句:"中秋节快乐". 今天咱们来聊一下如何自己动手,实现会话(Session)的存储方式.默认是存放在分布式内存中.由于HTTP消息是无状 ...

随机推荐

  1. codeforces 349B Color the Fence 贪心,思维

    1.codeforces 349B    Color the Fence 2.链接:http://codeforces.com/problemset/problem/349/B 3.总结: 刷栅栏.1 ...

  2. 分模块创建maven项目(一)

    maven是一个项目构建和管理的工具. 我们可以通过maven仓库可以实现管理构建(主要是JAR还包括:WAR,ZIP,POM等等). 我们可以通过maven插件可以实现编译源代.产生Javadoc文 ...

  3. 关于iOS多线程的总结

    关于iOS多线程的总结   在这篇文章中,我将为你整理一下 iOS 开发中几种多线程方案,以及其使用方法和注意事项.当然也会给出几种多线程的案例,在实际使用中感受它们的区别.还有一点需要说明的是,这篇 ...

  4. js打印功能

    1.window.print方式: jsp页面 打印按钮:       <input type="button" value="打印" onclick=& ...

  5. Week1 学长的经验教训

    我手头拿到的是上一届学长的软件工程大作业,作业的名称是——汽车4S店信息管理系统. 这个大作业我认为还是非常典型的传统模式的大作业,由手机端(客户端)和服务端组成,非常的传统.             ...

  6. js封装

    方法一: function Tetrio(singleW){ if(singleW == undefined){ singleW = 18; } this.x = 0; this.y = 0;} Te ...

  7. 关于web api 2 客户端请求Post

    (一).客户端的部分代码[需要添加NuGet程序包] 附:Client 声明方法 HttpClient client = new HttpClient(); client.BaseAddress = ...

  8. Oracle登录操作系统验证和密码文件验证

    1.确认数据库版本 2.查看当前配置文件 ORALCE数据库不同的登录验证方式是和SQLNET.ORA配置文件有关系的,在配置文件中有一个参数sqlnet.authentication_service ...

  9. [转载] Can't create table './store/#sql-b2c_1a.frm' (errno: 150)和sql execution error #1452添加外键时错误解决方法

    Can't create table './store/#sql-b2c_1a.frm' (errno: 150)解决方法 错误原因有四: 1.外键的引用类型不一样,主键是int外键是char 2.找 ...

  10. PowerDesigner 15.2入门学习 二

    PowerDesigner中如何生成主键和自增列 1.SQL Server版本: 第一步,首先要建立与数据库的连接,方法较多,这里举个例子: http://www.cnblogs.com/netsql ...