PHP7 + Symfony 2.8,无法写入会话数据

2022-08-30 23:32:56

我自己编译了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不能写会议?


答案 1

PHP7 对自定义会话处理程序的会话处理更为严格。Symfony 的用于其写入方法的自定义会话处理程序无论出于何种原因都返回 false。以前,这不会触发错误,但现在确实如此。

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

以下是不同的会话处理程序 Symfony,除了 Memcache 和 WriteCheckSessionHandler 之外,大多数会话处理程序似乎都显式返回 true:

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

编辑:

既然您提到了 Snc Redis 捆绑包会话处理程序,那么您确定使用的是最新版本吗?一年前,它被修改为在写入时始终返回 true:

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

更新

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

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


答案 2

如果您发现此线程是因为某些搜索结果中列表顶部出现的错误消息,并且没有使用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的答案为原始问题提供了更全面,更有用的解决方案。


推荐