【发布时间】:2017-06-07 00:15:35
【问题描述】:
在我的项目的配置文件中,我有:
session:
handler_id: session.handler.native_file
save_path: "%kernel.root_dir%/../var/sessions/%kernel.environment%"
"%kernel.root_dir%/../var/sessions 属于 wwww-data(是的,php-fpm 以 www-data 运行)。
当项目运行时,会在该目录中创建一个 (empty) 会话文件,但显然 php/symfony 在实际读取/写入它时遇到了麻烦,尽管能够正确创建它。这是刚刚创建的空会话文件(在此请求之后没有运行其他进程):
请求终止,引发异常:
会话数据文件不是由您的 uid 创建的。
我找到了这个answer(和一个this),并且通过这样做(将我的会话的save_path 设置为"/var/lib/php/sessions" 我能够继续(我可以看到我的会话文件不仅已创建,但其内容实际上已到位),但我试图了解为什么它无法将会话文件保存在自定义位置。
在我的 PHP 配置中,我看到我将 session.save_path 设置为 /var/lib/php/session,但我希望我能够在执行时覆盖它。
真正让我恼火的是会话文件被创建(所以文件权限应该没问题),但没有写入。
我在 nginx + php-fpm (7.0) 之上运行 Symfony 3.2.2。
为什么会这样?我应该使用任何其他设置,以便 php 能够覆盖此配置并将其会话文件写入其他地方吗?
从跟踪中我看到:
-
调用
NativeSessionStorage ->start(),并执行session_start(返回true) - 然后调用
SessionHandlerProxy ->read($sessionId),调用$this->handler->read($sessionId);时抛出异常。
【问题讨论】:
-
你能提供一些关于你的操作系统和 symfony 所在文件系统的信息吗?
-
你确定你已经使用 Symfony guide 设置了正确的权限吗? (更具体地说是
setfacl的部分)