PHP - 会话对象销毁失败

时间:2018-04-18 14:35:56

标签: php symfony session symfony-3.4

我在Symfony上面临一个奇怪的问题:基本上有时,没有任何明显的原因,用户无法加载网页,直到我重新启动php-fpm或直到他更改log_dir = "inception_log" if not os.path.exists(log_dir): os.makedirs(log_dir) #classify_image_graph_def.pd是google訓練好的模型 inception_graph_def_file = os.path.join("inception_model","classify_image_graph_def.pd") with tf.Session() as sess: #建一張圖存放google訓練好的模型 with tf.gfile.FastGFile(inception_graph_def_file,'rb') as f: graph_def = tf.GraphDef() graph_def.ParseFromString(f.read()) tf.import_graph_def(graph_def,name = "") #保存圖的結構 print("start") writer = tf.summary.FileWriter("inception_log",sess.graph) writer.close() print("end") 加载新会话。无论如何,在fpm重新启动后,他的会话仍然正常工作。

与此同时,我收到了来自PHP的2条警告:

  

PHP警告:session_start():会话对象销毁失败   /home/unix/releases/1/vendor/symfony/symfony/src/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php   第145行

     

PHP警告:session_start():无法解码会话对象。   会话已被破坏   /home/unix/releases/1/vendor/symfony/symfony/src/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php   第145行

考虑到我们所讨论的私有网站最多同时使用2-3个用户,但如果只有1个用户在其上导航,也可能会发生这种情况。

当前设置

  • Debian 9.4 stretch 4.14.0-0.bpo.3-amd64
  • php-fpm 7.1.15
  • Symfony 3.4.4

我能够使用apache ab使用相同的会话ID同时调用不同的URL来重现该问题。当然在 N 请求之后我得到了超时:

PHPSESSID

现在我正在尝试检查php配置但实际上是非常“正常”而没有特殊设置,所以我不知道应该尝试或检查什么。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

问题

最后我找到了问题。基本上它来自Symfony本身,因为默认情况下它似乎也在Symfony/Component/HttpFoundation/Session/Storage/Handler/StrictSessionHandler.php

中实现了garbage collection logic
public function gc($maxlifetime)
{
    return $this->handler->gc($maxlifetime);
}

如果/var/lib/php/sessions/目录属于php.ini中定义的同一用户,或者它具有读取权限,则不会出现问题,但默认情况下该目录属于root用户且不可读(因此无法列出文件)。当Symfony尝试在当前会话处理程序上调用垃圾收集器时,这会导致异常。

解决方案

有两种解决方案:设置

session:
    gc_probability: ~

在Symfony config.yml中或向PHP会话目录添加读取权限(或最终使用php.ini中定义的相同用户更改相对用户)。希望它可以帮到某人。