在 foreach 中使用 session_start 的致命错误(迁移后)


Fatal error using session_start inside foreach (after migration)

问题从什么时候开始的?

我的

托管服务提供商不得不像一周前一样将我的网站更改为另一台服务器。从那以后,我的一个脚本抛出了一个错误。由于在更改之前一切都在工作,我假设代码最初是正确的,所以我完全困惑为什么会发生这种情况,我希望您尝试让我朝着好的方向发展。

代码

出现问题的代码如下:

session_start();
   $items=$_SESSION['items'];
   $_SESSION['numItems']=0;
session_write_close();
foreach($items as $num => $currentItem){
   //here I work with $currentItem...
   session_start();//starting error line
      $_SESSION['numItems']++;
   session_write_close();
}
session_start();
   unset($_SESSION['numItems']);
session_write_close();

错误

如果我运行代码,我会收到一个 PHP 致命错误:注释为起始错误行的行中超过了 30 秒的最大执行时间。

现在,最奇怪的是,如果我检查 $_SESSION['numItems'] 的值,当数组$items不能超过 250 个元素时,它可以达到 12500(或更多)。所以有些东西正在创造一个无限循环!

需要考虑的事项

  1. 如果我注释掉foreach结构内的三个会话行(或者将它们移到外面),一切正常。

  2. 如果我只注释掉其中的第二行,问题仍然存在。

  3. 相同的代码结构,但使用while而不是foreach在同一服务器上的另一个脚本中工作。

  4. 我的托管服务提供商无法告诉我我使用的是哪个 PHP 版本和配置。现在,版本是 5.2.17。

感谢您的帮助!

编辑:

因为它引起了很多混乱:

代码结构打开和关闭会话,因为这样我就可以从第二个文件中读取会话变量,并让用户使用执行进度进行更新。第二个文件每 2 秒读取一次$_SESSION['numItems'],并且还会关闭与 session_write_close(); 的会话。

编辑 2:

测试代码但使用 set_time_limit(90) 增加最大执行时间根本没有帮助。它只是给出相同的错误(等待更长时间后),$_SESSION['numItems'] 以更高的值结束(大约 21000)。

你不必一遍又一遍地写session_startsession_write_close

session_start();
$items=$_SESSION['items'];
$_SESSION['numItems']=0;
foreach($items as $num => $currentItem){
   $_SESSION['numItems']++;
}
unset($_SESSION['numItems']);
session_write_close();
会话

的基本用法是:http://www.php.net/manual/en/session.examples.basic.php

在第一个session_start之后删除所有 session_start() 和 session_write_close() 应该可以解决您的问题。