在PHP 7.0中使用各种PHP框架会话驱动程序时存在错误.我最初在使用CodeIgniter数据库驱动程序时遇到了这个问题,并假设它是一个CodeIgniter问题,但后来在多个会话驱动程序和多个框架上经历过它.在这一点上,我已经安全地得出结论,会话驱动程序的类型是无关紧要的 - 看似随机,应用程序将崩溃,日志(我已经尝试过Apache和php-fpm + nginx)填满了以下内容:
PHP致命错误:session_start():初始化存储模块失败:用户(路径:[无论我在php.ini路径中有什么])
我正在使用的驱动程序不使用php.ini中设置的值,无论我是否将session.save_handler设置为php.ini中的文件,redis等,而不管我设置的路径(Redis服务器,如果redis,完全 - 启用文件的可写文件夹)发生错误.除非在框架之外的php文件中调用本机"session_start()",否则永远不应该触发此处的路径.此外,在框架之外调用"session_start()"工作正常......所以很明显PHP可以访问路径.就好像在某些时候,会话驱动程序变成了框架驱动程序和php.ini中设置的混合体.session.save_handler的错误消息总是有"user",所以显然不是从php.ini中提取的......但路径是.为什么会这样?这是一个难以描述的问题之一,直到你经历过......并且它很难重现,因为即使数百个会话(直到它突然停止工作),一切似乎都能正常工作.重新启动Apache也无法解决问题 - 这里有许多问题,我最终只是重新启动机器以避免停机.显然PHP 7机器现在将从负载平衡器轮换中退出......但我希望现在能够解决问题.
我经历过自己编译的PHP 7.0 RC5,RC6和RC8以及Ubuntu 15.10 Wily上最新的OndřejSurýPPA(7.0.0-2 + deb.sury.org~wily + 1)的问题.我在CodeIgniter和Symfony上遇到过这个问题,并且无论框架中使用的驱动程序类型(文件,数据库,redis)还是php.ini中设置的session.save_handler(都应该是不相关的)都遇到过这个问题.这里,但只是认为应该提到).我一直在尝试组合并在野外扔东西,这个问题每次都会发生(有时需要12个小时以上,具体取决于网站的流量).
感谢您的任何帮助,您可以提供!我愿意接受建议,并愿意在这一点上尝试任何事情.
当open()
会话处理程序的函数没有返回布尔值TRUE 时会发生此错误,这显然意味着某种失败.
它可能无法连接到数据库,无法打开文件,不存在的目录等 - 这取决于会话处理程序实际使用的内容.
function _open应返回true以避免此错误.
无论我们使用数据库还是文件,它都不能为null或为空.
当我们使用数据库来存储会话数据时,我们将其保留为空或不返回布尔值.这是导致此错误的主要原因.
class session_handler { public function __construct() { session_set_save_handler( array($this, "_open"), array($this, "_close"), array($this, "_read"), array($this, "_write"), array($this, "_destroy"), array($this, "_gc") ); } public function _open($savePath, $sessionId) { return true; } public function _close() { } public function _read($id) { } public function _write($id, $data) { } public function _destroy($id) { } public function _gc($max) { } }
它仅适用于PHP 7.我不知道它是否是一个bug.