1

在我的项目的配置文件中,我有:

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 在实际读取/写入它时遇到了麻烦,尽管能够正确创建它。这是刚刚创建的空会话文件(在此请求之后没有运行其他进程):

会话文件,已创建

请求终止,引发异常:

会话数据文件不是由您的 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(返回true
  • 然后SessionHandlerProxy ->read($sessionId)调用,调用时抛出异常$this->handler->read($sessionId);
4

3 回答 3

3

我能够重现相同的确切错误,创建会话文件但抛出“会话数据文件不是由您的 uid 创建的。”,但我不确定这是否是您的情况。

无论如何,我的猜测是您正在使用 nfs 服务器来保存您的代码,但是您在本地开发和运行 nginx。您将nfs挂载到服务器目录以将您的代码同步到服务器(我们在我之前的一个工作中也有同样的情况)。

因此,您将 nfs 服务器目录挂载到本地目录。发生的情况是 php 使用用户 www-data 创建您的会话文件,但该用户在服务器上的 uid 与您的本地计算机不同。所以文件被创建了,你看到了正确的所有者,但是它的 uid 是不同的。

查看:

关联

关联

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

于 2017-01-28T22:16:50.017 回答
-1

如果您想使用文件来保存会话,最佳做法是在与 Web 文件相同所有者的目录中执行此操作,而不是在“公共”文件夹中。例如,这可能意味着从 web 根目录开始的一个目录:

  • /home/myuser/会话/
  • /home/myuser/public_html/

这样,您的会话是安全的(无法从 Web 访问),与同一服务器中其他 Web 的会话分开,并且您确信可以管理该目录中的文件。

于 2017-01-27T23:03:24.460 回答
-1

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

避免使用/tmp

于 2017-12-29T11:03:53.840 回答