在项目目录中保存 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 能够覆盖此配置并将其会话文件写入其他地方吗?

从跟踪中我看到:

如果您想使用文件来保存会话,最佳做法是在与 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

link

这只是我最好的猜测。如果是这样,请告诉我,也许我可以帮助进行 nfs 用户映射。希望对你有帮助。

使用标准文件夹,即:/var/lib/php/session

避免使用/tmp