【问题标题】:Why would I be seeing execution timeouts when setting $_SESSION values?为什么在设置 $_SESSION 值时会看到执行超时?
【发布时间】:2011-03-01 06:58:09
【问题描述】:

我在我的 PHP 错误日志中看到以下错误:

PHP Fatal error: Maximum execution time of 60 seconds exceeded in D:\sites\s105504\www\index.php on line 3
PHP Fatal error: Maximum execution time of 60 seconds exceeded in D:\sites\s105504\www\search.php on line 4

有问题的行是:

index.php:

01 <?php
02 session_start();
03 ob_start();
04 error_reporting(E_All);
05 $_SESSION['nav'] = "range";  // <-- Error generated here

search.php

01 <?php
02 
03 session_start();
04 $_SESSION['nav'] = "range";
05 $_SESSION['navselected'] = 21; // <-- Error generated here

分配$_SESSION[] 值真的需要长达 60 多秒的时间吗?

平台是:

  • Windows 2003 SP2 + IIS6
  • FastCGI for Windows 2003(原始 RTM 版本)
  • PHP 5.2.6 非线程安全构建

当会话过期时,在服务器上清除会话数据文件没有任何问题。我看到的最早的 sess_XXXXXXXXXXXXXX 文件大约有 2 小时的历史。

事件日志中没有明显的磁盘超时或其他可能表明创建会话数据文件有困难的磁盘健康问题。

该站点也在负载不重的服务器上。该网站很忙,但没有受到重创,而且反应迅速。只是我们得到这些错误,连续三四个,每三四个小时一次。

我还应该补充一点,我不是这段代码的原始开发者,它属于一个开发者早已离开的客户。

【问题讨论】:

  • 您是否有任何会话处理程序可能会对会话进行某些操作?
  • 我不知道这可能是什么。设置自定义会话保存处理程序php.net/manual/en/function.session-set-save-handler.php 只是为了查看问题是否仍然存在并进行更详细的调试如何?手册页有一个完整的示例,应该足以复制+粘贴。

标签: php session iis iis-6


【解决方案1】:

会话被阻塞。 session_start() 将阻止执行,直到它可以获得该特定会话文件的排他锁。这是为了防止出现并发问题。完成每个脚本中的会话后,您可以通过发出session_write_close() 来解决它。您在下一行看到它的原因是 session_start() blocks for > 超过了最大执行时间。所以当它返回时,下一行在时间限制之后执行,所以这就是引发错误的地方。

请参阅:session_write_close() 了解更多信息

哦,根据您发布的错误,错误分别在 ob_start();$_SESSION['nav'] = "range"; 行生成,而不是您在代码部分中指出的第 5 行...

【讨论】:

  • 很好的信息,完全忘记了这一点。但是,只有当有第二个请求同时运行并且运行了很长时间时,这才可能是罪魁祸首。真的是这样吗?
  • 我遇到了同样的问题,不幸的是,在每个脚本上添加 session_write_close() 不是一个选项......如果我在 session_start() 之前添加 session_write_close() 你认为它可以解决它,直到我能够将它放在它应该在的地方?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-23
  • 1970-01-01
  • 2020-01-17
  • 2016-02-26
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多