致命错误:超过0秒的最大执行时间

20

我的脚本会比较两个源树,创建可能更改的文件映射,比较 MD5 哈希值并创建差异包。

在处理了 28000-29000 个文件后,PHP 报错终止了该脚本:

致命错误:/root/_PACKER-TESTER/core/diff.class.php 的标准 in_array() 调用超出了 0 秒的最大执行时间,在第 67 行 (standard in_array() call)

我已经尝试将 max_input_time 设置为很高的值(或零) - 没有任何效果。

max_execution_time 设置为 99999999999999 毫秒也没有反应......同样的错误。


您的999..999时间限制大约是一个47位数,远超过PHP的32位限制。 - Marc B
你是否在安全模式下运行?(set_time_limit文档)... - ircmaxell
Marc B - 对于这篇文章,我只是一遍又一遍地按9,没有数过有多少次 :) 在代码中,我没有超过32位 :) - kiler129
ircmaxell - 不,我正在以根权限从控制台运行。顺便说一下,安全模式已经过时了。 - kiler129
@kiler:我知道它已经过时了,但安全模式与控制台或root权限无关。这是一个php.ini设置... - ircmaxell
我知道 :) 我是一名有经验的程序员和 Linux 服务器管理员,但在这种情况下我一点头绪也没有。 - kiler129
4个回答

31
尝试在php.ini中设置max_input_time = -1,或使用set_time_limit(-1)。这对我而言起作用,无需重建PHP。
这篇文章解释得很好。

3
非常好用,我遇到了相同的错误,将 max_input_time 设置为 -1 就解决了。谢谢。 - amertkara
它可能不起作用 - LSAPI_*设置的优先级高于php.ini - 管理员可以通过LSAPI实施的限制,为用户授予对php.ini某些选项的访问权限而不会有风险。 - kiler129
只是想补充一下,设置0-1似乎会产生相同的效果。感谢您的帮助,更新max_input_time是必要的(在代码中使用set_time_limit没有改变任何东西,因为它似乎与已经为我设置为0max_execution_time有关)。错误消息似乎输出了无论max_execution_time设置为多少,即使实际上触发超时的是max_input_time设置。PHP 5.5.9在ubuntu 14.04上。 - Programster

9

问题已解决,使用 Litespeed API (LSAPI) 构建的 PHP 具有额外的 env 变量来确定最大执行时间 - LSAPI_MAX_PROCESS_TIME(默认为300秒)。


请标记您自己的答案以帮助他人。我认为如果您将CLI环境添加到标签/问题中会很酷。 - Samuel Herzog
它默认为300,但是否将其设置为零? - horatio
1
MAX_PROCESS_TIME与php设置的时间限制不同。Max process time是由litespeed技术添加的,以防止恶意脚本无休止地循环执行[set_time_limit()是CPU时间,而不是实际时间]。LSAPI触发内部php超时机制,我已向LiteSpeed技术报告了这一问题。因此,LSAPI_* env变量比php值具有更高的优先级 - 在共享环境中非常酷,用户无法运行超出全局限制的脚本,除非他获得LiteSpeed Web Server配置文件或Web面板访问权限 :) - kiler129

0

尝试使用set_time_limit(),并在phpinfo()中检查是否能够设置时间限制:

set_time_limit(60*60);phpinfo();exit;

set_time_limit() 似乎没有起到作用。我正在专用服务器上的控制台上运行脚本(我是 root 用户)。 - kiler129
在CLI中,此限制未生效。 - Mchl

-1
我发现“超过0秒的最大执行时间”可能是由代码进入无限循环引起的。
例如:
while (true) { ... }

这对我来说引起了错误。

如果不是环境变量(如先前提到的),我会检查php报告错误的行号上的内容。


1
无限循环总是一个问题,但有些脚本需要运行很长时间才能完成。因此,你的答案在这里不适用。 - Max

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接