为什么在设置$ _SESSION值时会看到执行超时?

时间:2010-06-08 17:22:36

标签: php session iis iis-6

我在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
  • 适用于Windows 2003的FastCGI(原始RTM版本)
  • PHP 5.2.6非线程安全构建

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

事件日志或其他可能表示难以创建会话数据文件的磁盘运行状况问题中没有明显的磁盘超时。

该网站也位于没有负载的服务器上。该网站很忙,但没有受到重创,反应灵敏。只是我们每三到四个小时就会连续三到四次出现这些错误。

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

1 个答案:

答案 0 :(得分:9)

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

有关详细信息,请参阅:session_write_close()

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