session_set_save_handler 设置用户自定义会话存储函数
例如:
如果想使用 PHP 内置的会话存储机制之外的方式, 可以使用本函数。
例如,可以自定义会话存储函数来将会话数据存储到数据库。两种使用方式:
1.PHP5.4之前
bool session_set_save_handler ( callable $open
, callable $close
, callable $read
,
callable $write
, callable $destroy
, callable $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机制失效,仍旧采用系统的!