17

我自己编译了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 无法编写会话的任何建议或想法?

4

4 回答 4

11

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

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

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

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

编辑:

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

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

更新

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

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

于 2015-12-07T05:53:12.313 回答
5

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

于 2016-03-29T12:09:19.350 回答
2

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

于 2015-12-07T23:30:50.873 回答
1

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

于 2017-09-01T22:39:42.067 回答