PHP7 + Symfony 2.8,写入会话数据失败

PHP7 + Symfony 2.8, Failed to write session data

我自己编译了 php7 (974f6c2a705)。 如果我 运行 php7 + php-fpm + nginx 使用 symfony 我得到这个错误:

(为会话使用 snc redis 包:)

 Warning: session_write_close(): Failed to write session data (user). Please verify that the current setting of session.save_path is correct (/tmp)

(使用本机会话支持:)

 Warning: session_write_close(): Failed to write session data (user). Please verify that the current setting of session.save_path is correct (/[...]/app/cache/dev/sessions)

问题似乎与 symfony 相关,因为 php 具有文件夹的读/写权限。

如果我 运行 只有这段代码,它就可以工作:

session_start();
$_SESSION['x'] = 4234;
session_write_close();

为什么 symfony 无法编写会话有什么建议或想法吗?

PHP7 对自定义会话处理程序的会话处理更为严格。 Symfony 的 write 方法的自定义会话处理程序,无论出于何种原因,returning false。以前这不会触发错误,但现在会。

由于我们没有很多关于您正在使用的自定义会话处理程序的信息,我建议您尽可能设置不同的自定义会话处理程序,因为它们中的大多数似乎 return 正确。

这里是 Symfony 的不同会话处理程序,除了 Memcache 和 WriteCheckSessionHandler:

中的大多数似乎明确 return true

https://github.com/symfony/symfony/tree/582f4753a343f230fbe18b4e9a0747d48351ddfb/src/Symfony/Component/HttpFoundation/Session/Storage/Handler

编辑:

既然你提到了 Snc Redis Bundle 会话处理程序,你确定你使用的是最新版本吗?一年前它被修改为总是 return true on write:

https://github.com/snc/SncRedisBundle/blob/master/Session/Storage/Handler/RedisSessionHandler.php

更新

向 PHP 提交了一个错误,看看我们是否可以找出对未来版本更有用的错误消息(请投票或对错误报告发表评论):

https://bugs.php.net/bug.php?id=71070

很高兴看到您的问题已得到解决 - 如果有人收到这些错误时偶然发现此线程,只是想添加另一个注释以清楚起见:错误显然始于框架驱动程序中的问题 and/or 它的配置和这就是为什么更新到最新的分支解决了这个问题。错误消息本身的发生是因为 PHP 试图使用 Symfony Redis 会话驱动程序,并且由于配置问题,恢复到 php.ini 中的 sess.save_path。这就是 PHP 无法写入目录的原因 - 它试图将用户 save_handler (Redis) 与 php.ini sess.save_path(文件)一起使用。如果它要回退到默认值,它也应该使用 php.ini sess.save_handler 设置。无论哪种方式,本例中的错误本身并不指向实际问题。

如果您是因为错误消息出现在某些搜索结果列表的顶部并且没有使用 Symphony 而找到此线程 - 这在我的案例中发生过。确保会话处理程序的写入方法 returns bool - true on success.

php session_set_save_handler documentation doesn't mention this. It is however mentioned in the SessionHandlerInterface 文档:

The return value (usually TRUE on success, FALSE on failure). Note this value is returned internally to PHP for processing.

在 PHP 的早期版本中,什么都不返回不会导致错误。自 PHP 7.0 起,不返回任何内容会导致错误:Warning: session_write_close(): Failed to write session data (user). Please verify that the current setting of session.save_path is correct (/tmp)

PHP 的未来版本看起来确实会发出更清晰的消息。 Failed to write session data using user defined save handler.

如果您使用的是 Symphony - 那么 Chris Banks 的回答为原始问题提供了更全面、更有用的解决方案。

我从 Apache PHP7 迁移到 PHP7-FPM 时遇到了同样的问题。 对我来说唯一的解决方法是转到我的 Symfony 应用程序的 var 目录并删除那里的所有文件,如果需要 chmod 777 修复 var 的权限。之后重新加载我的应用程序的 URL 并且一切顺利。之后 Symfony 将重新创建所有缓存、日志、会话等