数据被保存在本地文件中并返回给客户端(浏览器会存储)。
当我们在负载均衡集群环境中,负载调度部分负责把客户端请求按照不同的策略分配到后端服务节点上,所以我们可能在A机器上设置了,但是B机器上后续的请求还是空的。
常见负载均衡环境处理策略
PHP 也可以配置将 数据存储在 redis 中,或者其他几种方式。显然,Redis 在效率上更快,而且相比于 ,由于是持久化,所以更安全。因此,也是负载均衡环境处理的常用策略。但是由于信息存储在内存中,可能会出现内存不足、利用率低等问题。
优点:效率高缺点:信息存储在内存中,会产生大小不一的内存块,内存不能充分利用,可能会出现内存不足的情况。
设置处理
除了可以通过简单修改PHP中的配置项来设置其他处理方式之外,还提供了相应的接口,方便我们定制处理逻辑。
接下来我们通过自定义redis处理的逻辑来了解接口。
dler 函数
dler() 该函数定义用户逻辑,比如写入,检索,关闭等。该函数的参数如下:
该函数有两种用法
PHP5.4 之前使用
bool session_set_save_hanler(callback open,callback close,callback read,callback write,callback destory,callback gc)
可以看出,该函数的几个参数都是以回调函数的形式接收的。
范围
描述
打开
打开时的回调函数。接收两个参数,第一个参数是需要保存的路径,第二个参数是名称
关闭
操作完成时将调用此函数。它不接收任何参数。
读
作为参数。使用作为参数从数据存储中获取数据并返回该数据。如果数据为空,则返回空字符串。此函数在调用之前触发
写
数据存储时调用,接收两个参数,一个是值,一个是数据
调用时触发函数。它仅接受一个参数。
GC
当 PHP 执行垃圾回收机制时触发
调用方法:
.在PHP5.4及以上版本使用?也是推荐使用
session_set_save_handler ( object $sessionhandler [, bool $register_shutdown = TRUE ] ) : bool范围
描述
实现(ace,)或接口的对象,例如?。
将函数 ()? 注册为 () 函数。当 PHP 函数停止执行时可触发。
session_write_close()函数:结束当前会话并存储会话数据。调用方法:
我们看到第一个参数的描述,传入的参数应该是一个实现了ace接口的对象。
您还可以附加实现和接口
那么我们先来看看这些接口需要实现哪些方法
从了解几个接口实现
在说明中我们可以看到作为示例传入的参数即可,也就是说如果我们想要自定义的话可以参考该类中需要实现的方法。
= 5.4.0 提供的 SessionIdInterface 接口是PHP >= 5.5.1 提供的 SessionUpdateTimestampHandlerInterface 接口是PHP >= 7.0 提供的 接下来我们通过代码来实践一下,通过实现SessionHandlerInterface接口,来写一个redis的PHP Session处理程序 redis = new Redis(); $this->redis->connect('127.0.0.1',6379); // 设置session处理回调 并且将session_write_close注册为register_shutdown_function函数 session_set_save_handler($this, true); // 开启 session_start(); } function open($path, $name) { return true; } function close(){ return true; } function read($session_id) { $value = $this->redis->get("siam_".$session_id); if ($value){ return $value; } return ''; } function write($session_id, $data) { if( $this->redis->set("siam_".$session_id, $data) ){ $this->redis->expire("siam_".$session_id, $this->expTime); return true; } return false; } function destroy($session_id) { if ( $this->redis->delete("siam_".$session_id) ) { return true; } return false; } function gc($maxlifetime) { return true; // 因为redis设置了过期时间,不需要再gc回收 } function __destruct() { session_write_close(); } } new SiamSession(); 接着我们在另一个文件中写下测试代码
扫一扫在手机端查看
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。