php7的zend会话数据库中的错误

时间:2017-01-05 17:35:55

标签: php database session zend-framework php-7

我的应用需要使用数据库代替文件进行会话管理。 我的应用程序基于Zend Framework 1.12.17,php 5.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升级到php 7.0.10时,发生了警告

  

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

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

非常感谢

3 个答案:

答案 0 :(得分:2)

2016年9月,Zend Framework 1 is reached EOL(寿命终止)。这意味着它将不再被改进。代码库太旧了,无法与PHP 7一起使用。

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

  1. 在您的服务器上降级或并行运行PHP 5.6以支持古老的ZF1应用程序。
  2. 通过将DbTable处理程序扩展为suggested here来编写您自己的会话保存处理程序。

答案 1 :(得分:1)

除了edigus之外,这里还有扩展保存处理程序的简单实现:

<?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;
    }

}

答案 2 :(得分:1)

问题写在这里:https://github.com/zendframework/zf1/issues/665#issue-127528467

  

由于更新返回0但没有抛出异常仍然是一个成功的查询,没有错误

因此,函数write将返回false而不是true,而PHP 7.0需要true结果。

您可以通过更改Zend/Session/SaveHandler/DbTable.php

来解决此问题
if ($this->update($data, $this->_getPrimary($id, self::PRIMARY_TYPE_WHERECLAUSE))) {

要:

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

或者您也可以删除if,将其转换为指令,并保留$return = true;。因为在出错时,查询应该引发异常,因此任何没有异常的update()都是好的。