【问题标题】:PHP Warning: session_write_close() Zend Framework 1 and PHP 7.1.11-1 turns into blank pagePHP 警告:session_write_close() Zend Framework 1 和 PHP 7.1.11-1 变成空白页
【发布时间】:2018-04-17 04:44:24
【问题描述】:

我有一个 Zend Framework 1 (ZF1) 应用程序在 PHP 7.1.9-1 的 Docker 容器中运行。现在我已经更新了这样的容器,PHP 版本已更改为 7.1.11-1。出于某种原因,不知道我的应用程序已停止工作(我得到一个空白页),我能看到的唯一错误是:

[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 之间发生了一些变化,但我对此一无所知。

关于这里可能出现什么问题的任何想法?

【问题讨论】:

  • 这就是这个错误的所有error_log吗?看来您正在使用 db 处理程序进行会话,并且无法写入表。如果这是真的,您可以检查此链接并确认您的表是应该的吗? zendframework.github.io/zend-session/save-handler/…
  • @MehmetSÖĞÜNMEZ 这是 ZF1 我认为你给我的文档是其他版本而不是 1 :(
  • 是的,你是对的:/ 但原因是会话保存处理程序。你的设置是什么?它是文件还是数据库处理程序?你能分享会话设置吗?
  • @MehmetSÖĞÜNMEZ 抱歉耽搁了。看看我最近的编辑,这是你要求的吗?
  • 如果您使用的是多列数据库,文档中还有其他配置。您正在研究的是第一个示例还是第二个示例?

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


【解决方案1】:

好的,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`)
);

【讨论】:

  • 我认为写与否根本不是问题。我正在调试该函数,我可以看到 $data var 作为一个值数组出现,但 $data['data'] 仅包含:Zend_Auth|a:1:{s:7:"storage";N;} 这对我来说很奇怪,你有什么想法吗?
  • 无论哪种方式仍然无法正常工作,我找不到原因。我已经在 PHP 7.1.9 中进行了测试,它可以工作,但是一旦我升级到 7.1.11,它就会失败,这让我发疯
  • 我在 7.1.11 更新日志中找不到任何有用的关于会话的内容。 php.net/ChangeLog-7.php#7.1.11 似乎他们对 Apache2Handler 进行了一些更改,但我认为这不是原因。如果你想看看:bugs.php.net/bug.php?id=75311
  • 无论如何,在 7.1 的 zf1 会话中出现了问题,zend 不会修复它。如果可能的话,升级你的代码。
  • 遗憾的是,我无法摆脱 ZF1 自动取款机,但无论如何我不再为遇到问题的公司工作了。然而,这是一场个人斗争,因为我想找出在最新 PHP 版本上破坏应用程序的原因。
【解决方案2】:

我以前也遇到过类似的问题。

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

因此函数 write 将返回 false 而不是 true,而 PHP 7 需要一个 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)))) {

【讨论】:

  • 我在PR 中找到了这样的解决方法|“修复”,不久前也在this post 中,但遗憾的是它也不能解决我的问题。还是谢谢你
猜你喜欢
  • 2014-09-24
  • 1970-01-01
  • 1970-01-01
  • 2013-06-08
  • 2014-10-27
  • 1970-01-01
  • 2021-11-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多