php7的zend会话数据库中出错

php7的zend会话数据库中出错,php,database,session,zend-framework,php-7,Php,Database,Session,Zend Framework,Php 7,我的应用程序需要使用数据库而不是文件来进行会话管理。 我的应用程序基于Zend Framework 1.12.17、PHP5.6.25,实际上是基于wampserver 这是我的config.ini resources.session.use_only_cookies = true resources.session.gc_maxlifetime = 864000 resources.session.remember_me_seconds = 864000 resources.session.g

我的应用程序需要使用数据库而不是文件来进行会话管理。 我的应用程序基于Zend Framework 1.12.17、PHP5.6.25,实际上是基于wampserver

这是我的config.ini

resources.session.use_only_cookies = true
resources.session.gc_maxlifetime = 864000
resources.session.remember_me_seconds = 864000
resources.session.gc_probability = 1
resources.session.gc_divisor = 100
resources.session.saveHandler.class = "Zend_Session_SaveHandler_DbTable"
resources.session.saveHandler.options.name = "app_session"
resources.session.saveHandler.options.primary = "id"
resources.session.saveHandler.options.modifiedColumn = "modified"
resources.session.saveHandler.options.dataColumn = "data"
resources.session.saveHandler.options.lifetimeColumn = "lifetime"
当我想将php升级到PHP7.0.10时,出现了一个警告

警告:会话\写入\关闭():无法写入会话数据(用户)。请验证第732行D:\wamp\www\myapp\top\library\versions\ZendFramework-1.12.17-minimal\library\Zend\session.php中session.save\u路径的当前设置是否正确(D:\wamp\www\myapp\top\session)

我在寻找这个问题的根源。你有什么想法吗

非常感谢2016年9月(生命终结)。这意味着它将不再得到改善。代码库太旧,无法很好地与PHP7配合使用

无论如何,您至少有两个选择:

  • 降级到或在服务器上并行运行PHP5.6,以支持古老的ZF1应用程序
  • 通过将DbTable处理程序扩展为,编写自己的会话保存处理程序

  • 除了edigus answer之外,这里还有一个扩展存储处理程序的简单实现:

    <?php
    
    require_once 'Zend/Session/SaveHandler/DbTable.php';
    
    // NOTE: To fix an issue with Zend_Session_SaveHandler_DbTable on PHP 7 this class extends it and overrides the write
    // method to simply always return true.
    //
    // See: https://stackoverflow.com/a/44985594/1510754
    // See: https://github.com/zendframework/zf1/issues/665
    // See: https://github.com/zendframework/zf1/pull/654
    
    class My_Session_SaveHandler_DbTable extends Zend_Session_SaveHandler_DbTable
    {
    
        public function write($id, $data)
        {
            parent::write($id, $data);
            return true;
        }
    
    }
    

    问题写在这里:

    因为返回0但不引发异常的更新仍然是一个成功的查询,没有错误

    因此,函数
    write
    将返回
    false
    而不是
    true
    ,PHP7.0需要
    true
    结果

    您可以通过在
    Zend/Session/SaveHandler/DbTable.php
    中更改以下内容来解决此问题:

    if ($this->update($data, $this->_getPrimary($id, self::PRIMARY_TYPE_WHERECLAUSE))) {
    
    致:


    或者,如果
    ,也可以删除
    ,将其转换为指令,并保持
    $return=true。因为在出错时,查询应该引发异常,所以任何无异常的
    update()
    都是好的。

    我将测试第二个选项。如果有问题,我将降级到php5.6。谢谢!
    if (is_int($this->update($data, $this->_getPrimary($id, self::PRIMARY_TYPE_WHERECLAUSE)))) {