摘要:的存储方式在文件中,进行配置。一文件存储注释表示多级目录,值为数字。表示创建的文件权限。例如,设定为将使创建的会话文件和路径类似于。通过修改可选参数来改变这种默认行为,其中是的八进制表示。设置不影响进程的掩码。多机房的存储怎么弄同步呗
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 存储怎么弄?
同步呗!
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/30256.html
世界上任何一个拥有用户数据的 web 应用都必须处理 sessions。作为一名开发者,我们必须要知道它们是什么以及如何处理它们。在这篇文章中,我想要分享的是: session 是什么? session 如何存储数据? 你如何决定存放 session 数据的位置? 在 sessions 工作时,你必须意识到的安全性上的影响有哪些?在一些示例代码中,我将会运用 session npm modul...
摘要:所谓的无连接就是服务器收到了客户端的请求之后,响应完成并收到客户端的应答之后,即断开连接。从而节省传输时间。协议对事务的处理没有记忆能力。这种方式某种方面上讲解放了服务器,但是却不利于客户端与服务器的连接。 session与cookie是什么? session与cookie属于一种会话控制技术.常用在身份识别,登录验证,数据传输等.举个例子,就像我们去超市买东西结账的时候,我们要拿出我...
摘要:初步的猜想是第一次和第二次请求间隔太短,数据还没有存进,到时读取失败,带着这样的疑问,阅读了的源码。源码非常简单,没有复杂的数据结构和算法,读起来没费什么劲。当过期后,用户获取的就为空,就会为用户重新初始化生成。 欢迎大家访问我的博客,查看更多内容。 背景 最近在做djnago开发时,遇到一个session问题,过程如下,第一个POST请求时,把数据存放在session,在第二次POS...
摘要:保持状态保存在浏览器端,保存在服务器端存储的大小单个保存的数据不能超过大小没有限制。的目的是克服由所带来的一些限制,当数据需要被严格控制在客户端时,不需要持续的将数据发回服务器。的生命周期是仅在当前会话下有效。 写在前面 既然是浅谈,就不会详细从底层原理解释这几个的区别,就简单地聊一下,这几个的区别,优缺点,应用场景 cookie和session 浏览器的缓存机制提供了可以将用户数据存...
摘要:会话管理一直是企业级应用的重要部分。传统会话管理技术的问题的目的是解决传统的会话管理技术的各种问题。对如和之类的闭源产品,找到适合它们的会话管理技术的替代实现则通常是不可能的。典型的应用会将当前用户的身份及其安全级别或角色存储在会话里面。 欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文来自云+社区翻译社,由Tnecesoc编译。 会话管理一直是 Java 企业级应用的...
阅读 1586·2021-11-02 14:48
阅读 3630·2019-08-30 15:56
阅读 2746·2019-08-30 15:53
阅读 3191·2019-08-30 14:09
阅读 3076·2019-08-30 12:59
阅读 2833·2019-08-29 18:38
阅读 2658·2019-08-26 11:41
阅读 2185·2019-08-23 16:45