30

出于某种奇怪的原因,就在今天,我们的服务器决定在会话开始期间非常慢。对于每个 session_start,服务器要么在 30 秒后超时,要么需要大约 20 秒才能启动会话。这很奇怪,因为它已经很长时间没有这样做了(我们的服务器上一次这样做是在大约 7 个月前)。我尝试将会话更改为通过数据库运行,并且效果很好,但是,随着我们当前的网站的构建,每个页面都需要几天时间并更改会话的加载以包含新会话处理程序。因此我的问题仍然存在:

为什么它这么慢,为什么只是有时?

我们在具有 24GB 内存的专用 hetzner 服务器上运行,CPU 速度快到足以运行一个简单的网络服务器(我相信是 Xeon,但我不确定)。我们使用 apache+fastcgi+php5 设置在服务器上运行 debian。

服务器不会通过服务器状态和top命令报告太多负载。Vnstat报告我们的网络链接没有任何问题(同样,这不会导致本地会话处理缓慢)。IOtop报告进程接管整个硬盘驱动器没有问题。如果通过 vim 完成,写入会话文件所在的 tmp 文件夹会很快。

再说一次,为了清楚起见,我主要关心的不是我们是否应该切换到数据库或内存缓存版本的会话,只是想问为什么会发生这种情况,因为我所看到的一切似乎工作正常,除了 PHP 本身。

编辑:我们的 PHP tmp 目录中的最大文件是 2.9 MB,所以我相信没有什么会产生影响。

更新:我从来没有弄清楚出了什么问题和/或如何解决它,但是在我们切换到 memcached/db 会话后问题就消失了。

4

6 回答 6

19

你试过session_write_close();吗?这将禁用会话变量中的可写能力,但您仍然可以从中读取数据。稍后当您需要编写会话变量时,重新打开它。

我也遇到过这个问题,但这件事就像一个魅力。这就是我所做的:

session_start(); //starts the session
$_SESSION['user']="Me";
session_write_close();   // close write capability
echo $_SESSION['user']; // you can still access it
于 2013-07-28T07:29:12.453 回答
6

我遇到了同样的问题:突然服务器花了 30 秒来执行一个请求。我注意到这是因为session_start()。第一个请求很快,但每个下一个请求需要大约30 秒才能执行。我发现 c:\wamp\tmp 中的会话文件被第一个请求锁定了大约 30 秒。在此期间,第二个请求正在等待文件被解锁。我发现它与rewrite_mod.htaccess有关。我禁用了 rewrite_mod 并注释掉了 .htaccess 中的每一行,它再次像魅力一样工作。我不知道为什么会发生这种情况,因为我不记得在 wamp 上更改任何设置或配置。

于 2015-08-22T11:16:58.697 回答
2

我也遇到了这个问题。在这里得到了回答:

函数 session_start() 的问题(工作缓慢)

会话在一个脚本执行时被 PHP 锁定,因此如果脚本堆叠在同一个会话下,它们可能会导致这些令人惊讶的长时间延迟。

于 2013-04-15T05:15:11.237 回答
0

每个会话都由 apache 存储为一个文本文件。

当会话启动用于恢复现有会话时(例如通过 cookie 标识符),可能一个大的会话文件(一个内部有很多内容的会话)启动速度很慢?

如果是这种情况,您的应用程序可能会将大量数据放入会话中。

于 2012-04-30T14:54:28.710 回答
0

请检查您是否有正确的内存缓存设置,例如/etc/php.d/memcached.ini

于 2016-10-05T10:57:51.360 回答
0

我知道这是一个老问题,但我刚刚在我的服务器上解决了这个问题。我所做的只是在 cpanel 的缓存管理器中为域打开旁路缓存。

我的会议需要很长时间才能开始和结束,现在它们是即时的。

于 2018-05-28T14:54:18.863 回答