在项目目录中保存 php 个会话时出错
error when saving php sessions in project's directory
在我的项目配置文件中,我有:
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
)。
当项目运行时,在该目录中创建了一个(空)会话文件,但显然 php/symfony 实际上 reading/writing 它有问题,尽管能够正确地创建它。这是刚刚创建的空会话文件(此请求后没有其他进程 运行):
请求终止并引发异常:
Session data file is not created by your uid.
我找到了这个 (and 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
(其中 returns true)
- 然后调用
SessionHandlerProxy ->read($sessionId)
,调用$this->handler->read($sessionId);
时抛异常。
如果您想使用文件来保存会话,最佳做法是在与 Web 文件相同的所有者的目录中执行此操作,而不是在 "common" 文件夹中。这可能意味着,例如,从网络根目录开始的一个目录:
- /home/myuser/sessions/
- /home/myuser/public_html/
通过这种方式,您的会话是安全的(无法从 Web 访问),与同一服务器中其他 Web 的会话分开,并且您确定可以管理该目录中的文件。
我能够重现完全相同的错误,创建会话文件但抛出 "Session data file is not created by your uid.",但我不确定这是否是您的情况。
无论如何,我的猜测是您正在使用 nfs 服务器来保存您的代码,但是您在本地开发和 运行 nginx。你做了一个 nfs 挂载到服务器目录以将你的代码同步到服务器(我们在我以前的一份工作中有相同的)。
所以你把nfs服务器目录挂载到本地目录。发生的情况是 php 使用用户 www-data 创建您的会话文件,但该用户在服务器上的 uid 与您的本地计算机上的不同。因此文件已创建,您会看到正确的所有者,但它的 uid 不同。
检查:
link
这只是我最好的猜测。如果是这样,请告诉我,也许我可以帮助进行 nfs 用户映射。希望对你有帮助。
使用标准文件夹,即:/var/lib/php/session
避免使用/tmp
在我的项目配置文件中,我有:
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
)。
当项目运行时,在该目录中创建了一个(空)会话文件,但显然 php/symfony 实际上 reading/writing 它有问题,尽管能够正确地创建它。这是刚刚创建的空会话文件(此请求后没有其他进程 运行):
请求终止并引发异常:
Session data file is not created by your uid.
我找到了这个 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
(其中 returns true)- 然后调用
SessionHandlerProxy ->read($sessionId)
,调用$this->handler->read($sessionId);
时抛异常。
如果您想使用文件来保存会话,最佳做法是在与 Web 文件相同的所有者的目录中执行此操作,而不是在 "common" 文件夹中。这可能意味着,例如,从网络根目录开始的一个目录:
- /home/myuser/sessions/
- /home/myuser/public_html/
通过这种方式,您的会话是安全的(无法从 Web 访问),与同一服务器中其他 Web 的会话分开,并且您确定可以管理该目录中的文件。
我能够重现完全相同的错误,创建会话文件但抛出 "Session data file is not created by your uid.",但我不确定这是否是您的情况。
无论如何,我的猜测是您正在使用 nfs 服务器来保存您的代码,但是您在本地开发和 运行 nginx。你做了一个 nfs 挂载到服务器目录以将你的代码同步到服务器(我们在我以前的一份工作中有相同的)。
所以你把nfs服务器目录挂载到本地目录。发生的情况是 php 使用用户 www-data 创建您的会话文件,但该用户在服务器上的 uid 与您的本地计算机上的不同。因此文件已创建,您会看到正确的所有者,但它的 uid 不同。
检查:
link
这只是我最好的猜测。如果是这样,请告诉我,也许我可以帮助进行 nfs 用户映射。希望对你有帮助。
使用标准文件夹,即:/var/lib/php/session
避免使用/tmp