PHP警告:session_write_close()Zend Framework 1和PHP 7.1.11-1变成空白页面

时间:2017-11-04 16:31:19

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

我有一个使用PHP 7.1.9-1在Docker容器中运行的Zend Framework 1(ZF1)应用程序。现在我已更新此类容器,PHP版本已更改为7.1.11-1。出于某种原因 unknow 对我来说,应用程序已停止工作(我有一个空白页面),我能看到的唯一错误是:

[Sat Nov 04 16:05:45.500626 2017] [php7:notice] [pid 61] [client 172.18.0.1:49356] PHP Warning:  session_write_close(): Failed to write session data using user defined save handler. (session.save_path: /var/lib/php/sessions) in /var/www/html/vendor/zendframework/zendframework1/library/Zend/Session.php on line 732
[Sat Nov 04 16:05:45.500637 2017] [php7:notice] [pid 61] [client 172.18.0.1:49356] PHP Stack trace:
[Sat Nov 04 16:05:45.500653 2017] [php7:notice] [pid 61] [client 172.18.0.1:49356] PHP   1. Zend_Session_SaveHandler_DbTable->__destruct() /var/www/html/vendor/zendframework/zendframework1/library/Zend/Session/SaveHandler/DbTable.php:0
[Sat Nov 04 16:05:45.500658 2017] [php7:notice] [pid 61] [client 172.18.0.1:49356] PHP   2. Zend_Session::writeClose($readonly = *uninitialized*) /var/www/html/vendor/zendframework/zendframework1/library/Zend/Session/SaveHandler/DbTable.php:217
[Sat Nov 04 16:05:45.500661 2017] [php7:notice] [pid 61] [client 172.18.0.1:49356] PHP   3. session_write_close() /var/www/html/vendor/zendframework/zendframework1/library/Zend/Session.php:732

我知道有很多关于此的信息,但我尝试的任何内容都没有为我工作。其中一些是:

这是在bootstrap.php文件中设置会话保存处理程序的方式,如文档中所述的here

$config = [
    'name'           => 'session',
    'primary'        => 'id',
    'modifiedColumn' => 'modified',
    'dataColumn'     => 'data',
    'lifetimeColumn' => 'lifetime',
];

Zend_Session::setSaveHandler(new Zend_Session_SaveHandler_DbTable($config));
Zend_Session::start();

我也知道ZF1最近达到了它的EOL并且没有支持但是现在我可以在我的应用程序上摆脱ZF1并且我不想回到PHP5。

我的猜测是在7.1.9和7.1.10之间发生了变化,但我对它没有任何线索。

这里可能出现什么问题?

2 个答案:

答案 0 :(得分:0)

好的,https://github.com/zendframework/zf1/issues/665的错误报告和https://github.com/zendframework/zf1/pull/654的拉取请求。但由于EOL,他们不会解决这个问题。

正如@zerocrates所提到的,你可以解决代码或忽略它。这是Zend / Session / SaveHandler / DbTable.php第338行的代码

public function write($id, $data)
{
    $return = false;
    $data = array($this->_modifiedColumn => time(),
                  $this->_dataColumn     => (string) $data);
    $rows = call_user_func_array(array(&$this, 'find'), $this->_getPrimary($id));
    if (count($rows)) {
        $data[$this->_lifetimeColumn] = $this->_getLifetime($rows->current());
        if ($this->update($data, $this->_getPrimary($id, self::PRIMARY_TYPE_WHERECLAUSE))) {
            $return = true;
        }
    } else {
        $data[$this->_lifetimeColumn] = $this->_lifetime;
        if ($this->insert(array_merge($this->_getPrimary($id, self::PRIMARY_TYPE_ASSOC), $data))) {
            $return = true;
        }
    }
    return $return;
}

正如您所看到的,如果db无法写入,则返回false。您可以编辑代码库或扩展它并始终返回true。

为什么db不能写呢?我不知道。如果您的表和配置有效,它期望运行良好。由于您的配置,您似乎正在使用一个列会话,所以您的表必须像;

CREATE TABLE `session` (
`id` char(32),
`modified` int,
`lifetime` int,
`data` text,
PRIMARY KEY (`id`)
);

答案 1 :(得分:0)

之前我遇到过类似的问题。

  

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

因此函数将返回 false 而不是 true ,而PHP 7需要一个真实的结果。

我已经修改了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)))) {