我有一个使用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之间发生了变化,但我对它没有任何线索。
这里可能出现什么问题?
答案 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)))) {