首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PHP 7用户会话问题-无法初始化存储模块

PHP 7用户会话问题-无法初始化存储模块
EN

Stack Overflow用户
提问于 2015-12-07 11:14:43
回答 14查看 58.3K关注 0票数 7

在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+几个小时,这取决于网站的流量)。

感谢您能提供的任何帮助!在这一点上,我对建议持开放态度,并愿意尝试任何事情。

EN

回答 14

Stack Overflow用户

发布于 2015-12-08 22:33:19

当会话处理程序的open()函数没有返回布尔值TRUE时,就会出现这个错误,这显然意味着某种故障。

可能是连接数据库失败、打开文件失败、目录不存在等--这取决于会话处理程序实际使用的是什么。

票数 7
EN

Stack Overflow用户

发布于 2016-02-16 19:07:08

函数_open应返回true以避免此错误。

无论我们使用数据库还是文件,它都不能为null或空。

当我们使用数据库存储会话数据时,我们将其保留为空或不返回布尔值。这就是导致这个错误的主要原因。

代码语言:javascript
复制
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。

票数 6
EN

Stack Overflow用户

发布于 2017-08-31 00:24:45

这通常是由于会话无法连接到它使用的任何驱动程序(文件、数据库)。

我通过查看config.php文件解决了这个问题

代码语言:javascript
复制
    $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;

因此,由于我使用的是数据库,这意味着它由于某种原因无法连接!(对于文件,它可能没有写入缓存文件的权限)

接下来,我打开了日志

代码语言:javascript
复制
    $config['log_threshold'] = 4;

其中4 = All Messages..然后刷新页面,现在我在application/logs中有一个名为log-#.php的文件,其中#是日期。

代码语言:javascript
复制
    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

因此,我只需确保用户可以访问数据库并使其正常工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34125849

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档