在项目目录中保存php会话时出错

时间:2017-01-22 11:16:55

标签: php session symfony fpm

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

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

session file, created

请求死了引发异常:

  
    

会话数据文件不是由您的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);时抛出异常。

3 个答案:

答案 0 :(得分:3)

我能够重现同样的错误,创建会话文件但是扔掉#34;会话数据文件不是由您的uid创建的。&#34;,但我不确定这是不是你的情况。< / p>

无论如何,我的猜测是你使用的是nfs服务器来保存你的代码,但你在本地开发和运行nginx。您对服务器目录进行了 nfs 安装,以将您的代码同步到服务器(我之前的工作中也有相同的内容)。

因此,您将nfs服务器目录挂载到本地目录。会发生什么是php用用户www-data创建你的会话文件,但是这个用户在服务器上有一个不同于本地机器的uid。所以创建文件,你看到正确的所有者,但它的uid是不同的。

检查:

link

link

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

答案 1 :(得分:-1)

如果要使用文件来保存会话,最佳做法是在与Web文件相同的所有者的目录中进行,而不是在“common”文件夹中。例如,这可能意味着从web root开始的一个目录:

  • /家庭/为myuser /会话/
  • /家庭/为myuser /的public_html /

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

答案 2 :(得分:-1)

使用标准文件夹,即:$ sudo easy_install pip $ sudo easy_install --upgrade six $ export TF_BINARY_URL=https://storage.googleapis.com/tensorflow/mac/tensorflow-0.9.0-py2-none-any.whl $ sudo pip install --upgrade $TF_BINARY_URL

避免使用/var/lib/php/session