我在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个用户在其上导航,也可能会发生这种情况。
当前设置
我能够使用apache ab使用相同的会话ID同时调用不同的URL来重现该问题。当然在 N 请求之后我得到了超时:
PHPSESSID
现在我正在尝试检查php配置但实际上是非常“正常”而没有特殊设置,所以我不知道应该尝试或检查什么。有什么想法吗?
答案 0 :(得分:1)
最后我找到了问题。基本上它来自Symfony本身,因为默认情况下它似乎也在Symfony/Component/HttpFoundation/Session/Storage/Handler/StrictSessionHandler.php
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
中定义的相同用户更改相对用户)。希望它可以帮到某人。