在PHP 7.0中使用各种PHP框架会话驱动程序时存在错误。我最初在使用CodeIgniter数据库驱动程序时遇到了这个问题,并认为这是一个CodeIgniter问题,但后来在多个会话、驱动程序和多个框架上都遇到了这个问题。在这一点上,我已经得出结论,会话驱动的类型是不相关的-似乎是随机的,应用程序将崩溃,日志(我已经尝试过Apache和php-fpm + nginx)填满了以下内容:
PHP致命错误: session_start():无法初始化存储模块:用户(路径:我的php.ini路径中的任何内容)
我使用的驱动程序不使用php.ini中设置的值,无论我在php.ini中将session.save_handler设置为文件、redis等,也不管我设置了什么路径(Redis服务器,如果是redis,则是启用了文件的完全可写文件夹),都会出现错误。除非在框架外的php文件中调用了本机的"session_start()“,否则这里的路径永远不应该被命中。此外,在框架外调用"session_start()“也很好……因此,很明显PHP可以访问该路径。似乎在某个时刻,会话驱动程序变成了框架驱动程序和php.ini中设置的任何东西的混合体。对于session.save_handler,错误消息总是有"user“,所以很明显这不是从php.ini中提取的……但这条路是。为什么会发生这种情况?这是一个很难描述的问题,除非你亲身经历过……而且它很难再现,因为即使在数百个会话中(直到它突然停止工作),一切似乎都工作得很好。重启Apache也不能纠正这个问题-这里有许多问题,我最终只是重启了机器以避免停机。显然,PHP7机器现在将退出负载均衡器轮换……但我希望现在能把事情弄清楚。
我已经经历了PHP7.0 RC5,RC6和我自己编译的RC8的问题,以及Ubuntu15.10WILY (7.0.0-2+deb.sury.org~ Wily +1)上最新的řej Sur£¬PPA。我在CodeIgniter和Symfony上遇到过这个问题,无论框架中使用的是哪种类型的驱动程序(文件、数据库、redis),还是php.ini中设置的session.save_handler (这在这里应该是无关紧要的,但只是认为应该提到它),我都遇到过这个问题。我一直在尝试组合,并在野外扔东西,这个问题每次都会发生(有时需要花费12+几个小时,这取决于网站的流量)。
感谢您能提供的任何帮助!在这一点上,我对建议持开放态度,并愿意尝试任何事情。
发布于 2015-12-08 22:33:19
当会话处理程序的open()
函数没有返回布尔值TRUE时,就会出现这个错误,这显然意味着某种故障。
可能是连接数据库失败、打开文件失败、目录不存在等--这取决于会话处理程序实际使用的是什么。
发布于 2016-02-16 19:07:08
函数_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) { }
}
它只适用于PHP7,我不知道它是不是一个bug。
发布于 2017-08-31 00:24:45
这通常是由于会话无法连接到它使用的任何驱动程序(文件、数据库)。
我通过查看config.php
文件解决了这个问题
$config['sess_driver'] = 'database';
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = 'ci_sessions';
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;
因此,由于我使用的是数据库,这意味着它由于某种原因无法连接!(对于文件,它可能没有写入缓存文件的权限)
接下来,我打开了日志
$config['log_threshold'] = 4;
其中4 = All Messages
..然后刷新页面,现在我在application/logs
中有一个名为log-#.php
的文件,其中#
是日期。
INFO - 2017-08-30 10:05:41 --> Database Driver Class Initialized
ERROR - 2017-08-30 10:05:41 --> Severity: Warning --> mysqli::real_connect(): (HY000/1045): Access denied for user 'user'@'localhost' (using password: YES) /var/system/database/drivers/mysqli/mysqli_driver.php 202
ERROR - 2017-08-30 10:05:41 --> Unable to connect to the database
ERROR - 2017-08-30 10:05:41 --> Severity: Warning --> mysqli::real_connect(): (HY000/1045): Access denied for user 'user'@'localhost' (using password: YES) var/system/database/drivers/mysqli/mysqli_driver.php 202
ERROR - 2017-08-30 10:05:41 --> Severity: Error --> session_start(): Failed to initialize storage module: user (path: ci_sessions) /var/system/libraries/Session/Session.php 140
因此,我只需确保用户可以访问数据库并使其正常工作。
https://stackoverflow.com/questions/34125849
复制相似问题