session_set_save_handler()函数注意细节

session_set_save_handler  设置用户自定义会话存储函数

例如:

如果想使用 PHP 内置的会话存储机制之外的方式, 可以使用本函数。

例如,可以自定义会话存储函数来将会话数据存储到数据库。两种使用方式:

1.PHP5.4之前

bool session_set_save_handler ( callable $open , callable $close , callable $read , 

callable $write , callable $destroycallable $gc [, callable $create_sid ] ) 2.PHP5.4之后

bool session_set_save_handler ( SessionHandlerInterface $sessionhandler [, bool $register_shutdown = true ] )

详情,可查看PHP手册:

http://php.net/manual/zh/function.session-set-save-handler.php

还是摘自手册中的内容:

$handler = new FileSessionHandler(); // 我们自定义了一个session处理类,包含必须的几个方法
session_set_save_handler(
     array(
$handler'open'),
     array(
$handler'close'),
     array(
$handler'read'),
     array(
$handler'write'),
     array(
$handler'destroy'),
     array(
$handler'gc')
    );

// 下面这行代码可以防止使用对象作为会话保存管理器时可能引发的非预期行为
register_shutdown_function('session_write_close');

session_start();
// 现在可以使用 $_SESSION 保存以及获取数据了

这里主要是想说:

使用session_set_save_handler(),得记得使用 'register_shutdown_function',手册中是这样解释的:

在脚本执行完毕之后,PHP 内部会清除对象, 所以有可能不调用 write 和 close 回调函数。 这样可能会引发非预期

的行为,所以当使用对象作为会话保存管理器时, 需要通过注册 shutdown 回调函数来规避风险。 通常,你可以通过

调用 register_shutdown_function() 函数 来注册 'session_write_close' 回调函数。


接下来提到的非常关键的一点,是项目中真实出现的,而这个问题,我是真不知道,因为自定义的session机制,我没写过,都是进公司就是直接使用别人写好的,二次开发产品,肯定也是,所以,调试的过程中,很多应用问题,确实根本就没碰到过:

使用了自定义的session机制,php.ini 中的session.auto_start,必须设置为false。否则自定义的session机制失效,仍旧采用系统的!


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值