使用foreach内部的session_start导致致命错误(迁移后)

时间:2013-09-11 21:16:44

标签: php session foreach infinite-loop

问题何时开始?

我的托管服务提供商必须在一周前将我的网站更改为其他服务器。从那以后,我的一个脚本抛出错误。由于在更改之前一切正常,我假设代码最初是正确的,所以我完全感到困惑,为什么会发生这种情况,我希望你能让我朝着这个方向努力。

代码

提出问题的代码如下:

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。

  5. 感谢您的帮助!

    编辑:

    因为它引起了很多混乱:

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

    编辑2:

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

2 个答案:

答案 0 :(得分:0)

您不必一次又一次地写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();

答案 1 :(得分:0)

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

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