首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP -会话对象销毁失败

PHP -会话对象销毁失败
EN

Stack Overflow用户
提问于 2018-04-18 14:35:55
回答 1查看 1.3K关注 0票数 3

我在Symfony上遇到了一个奇怪的问题:基本上有时候,没有任何明显的原因,用户在重新启动php或更改其PHPSESSID加载一个新会话之前,无法加载网页。无论如何,在重新启动fpm之后,他的会话仍然正常工作。

同时,我收到了来自PHP的两个警告:

PHP警告: /home/unix/releases/1/vendor/symfony/symfony/src/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php第145行中session_start():会话对象销毁失败 PHP : session_start():未能解码会话对象。会话已在第145行的/home/unix/releases/1/vendor/symfony/symfony/src/Symfony/Component/HttpFoundation/Session/Storage/NativeSessionStorage.php中被销毁。

考虑一下,我们正在讨论的是一个最多使用2-3个用户的私有网站,但如果只有一个用户在上面导航,也可能会发生这种情况。

当前设置是

  • Debian 9.4拉伸4.14.0-0.bpo.3-amd64 64
  • php 7.1.15
  • Symfony 3.4.4

我能够使用阿帕奇ab使用相同的会话id同时调用不同的URL来再现问题。当然,在N个请求之后,我得到了超时:

代码语言:javascript
复制
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
apr_pollset_poll: The timeout specified has expired (70007)
Total of 872 requests completed

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-19 08:48:03

问题所在

最后,我找到了这个问题。基本上,它来自Symfony本身,因为在默认情况下,它似乎也在Symfony/Component/HttpFoundation/Session/Storage/Handler/StrictSessionHandler.php中实现了某种类型的Symfony/Component/HttpFoundation/Session/Storage/Handler/StrictSessionHandler.php

代码语言:javascript
复制
public function gc($maxlifetime)
{
    return $this->handler->gc($maxlifetime);
}

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

解决方案

有两种解决方案:设置

代码语言:javascript
复制
session:
    gc_probability: ~

在Symfony中,config.yml或向permission目录添加读权限(或最终使用php.ini中定义的相同的相对用户)。希望能帮上忙。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49902480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档