我自己编译了php7(974f6c2a705)。 如果我使用symfony运行php7 + php-fpm + nginx我会收到此错误:
(使用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无法编写会话的任何建议或想法?
答案 0 :(得分:10)
PHP7对自定义会话处理程序的会话处理更严格。无论出于何种原因,Symfony的write方法的自定义会话处理程序返回false。以前这不会触发错误,但现在确实如此。
由于我们没有关于您正在使用哪个自定义会话处理程序的大量信息,因此我建议如果可能的话设置不同的自定义会话处理程序,因为它们中的大多数似乎都返回true。
以下是不同的会话处理程序Symfony,除了Memcache和WriteCheckSessionHandler之外,其中大部分都显式返回true:
编辑:
由于您提到了Snc Redis Bundle会话处理程序,您确定使用的是最新版本吗?一年前它被修改为总是在写上返回true:
https://github.com/snc/SncRedisBundle/blob/master/Session/Storage/Handler/RedisSessionHandler.php
<强>更新强>
向PHP提交了一个错误,看看我们是否可以为将来的版本找出更有用的错误消息(请投票或对错误报告发表评论):
答案 1 :(得分:4)
如果您发现此主题是因为某些搜索结果中的错误消息显示在列表顶部且未使用Symphony - 这种情况发生在我的情况下。确保会话处理程序的write方法返回bool - true on success
。
php session_set_save_handler文档没有提到这一点。但是在SessionHandlerInterface文档中提到了它:
返回值(成功时通常为TRUE,失败时为FALSE)。请注意,此值将在内部返回给PHP进行处理。
在早期版本的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的答案将为原始问题提供更全面,更有用的解决方案。
答案 2 :(得分:2)
很高兴看到你的问题得到解决 - 只是为了清楚地添加另一个注释,如果收到这些错误的人偶然发现这个错误:错误显然是从框架驱动程序和/或其配置中的问题开始的,这就是更新的原因到最新的分支机构解决了这个问题。错误消息本身发生是因为PHP试图使用Symfony Redis会话驱动程序,并且由于配置问题,还原到php.ini中的sess.save_path。这就是PHP无法写入目录的原因 - 它试图将用户save_handler(Redis)与php.ini sess.save_path(文件)一起使用。如果它将回退到默认值,它应该使用php.ini sess.save_handler设置。无论哪种方式,在这种情况下错误本身并不指向实际问题。
答案 3 :(得分:0)
当我从Apache PHP7迁移到PHP7-FPM时,我遇到了同样的问题。 只修复我的是去我的Symfony应用程序的var目录并删除那里的所有文件,如果需要chmod 777修复var的权限。之后重新加载我的应用程序的URL,好了。之后,Symfony将重新创建所有缓存,日志,会话等。