因为我执行了很长时间的任务,所以我知道我会用完一些东西.那不是问题.
我只是好奇,我怎么同时得到两个错误?
致命错误:允许内存大小为805306368字节耗尽(试图分配71个字节)...
-
致命错误:第0行的未知数超过300秒的最长执行时间
第一个"致命"错误不应该停止执行吗?我正在运行APC和php 5.2.6.
编辑: 这是一个截图
您可能在这里遇到了竞争条件。
它基本上可以工作,例如在内存的关闭函数中触发 FATAL,并在之前触发关闭函数的超时中触发 FATAL:
register_shutdown_function(function() {
# consume all memory
echo "break my pain\n";
$a = ['hello'];
while($a[] = $a);
});
set_time_limit(1);
while(1) usleep(100);
Run Code Online (Sandbox Code Playgroud)
它也以相反的方式工作,首先触发内存的 FATAL,然后触发关闭函数中超时的 FATAL:
register_shutdown_function(function() {
set_time_limit(1);
while(1) usleep(100);
});
ini_set('memory_limit', '1');
$a = array_fill(0, 1024, 'hello');
while($a[] = $a);
Run Code Online (Sandbox Code Playgroud)
这还不能 100% 解释 Codeigniter 内部发生的情况,但是我想说查询花费的时间太长,因此返回后也会触发执行时间限制。由于您的 PHP 版本较旧,这有点难以重现。如果我现在评估 PHP 代码,我会收到一条消息,表明代码已被评估,并且在哪一行找到了 eval 命令(PHP 5.4)。尝试使用 PHP 5.4 进行重现以获取更多信息。您还将从 PHP 5.2 以来的速度改进中受益匪浅。你错过了很多。
早些时候:
致命错误:第 0 行未知中超出了最大执行时间 300 秒
这听起来像是启动错误。
很难说是什么引发了你的第一个错误,你把它切断了。要么您在这里获得了经过评估的代码,这些代码可能已通过 APC 部分处理,您可能会在同一脚本中看到两个致命错误。
但是,如果您可以重现它,请尝试不使用 APC。如果仍然可以,请在 PHP bugtracker 中报告它。
如果不能,请向 APC bugtracker 报告问题。
编辑:刚看到 PHP 5.2.6,您可能需要自己报告并修复它;) - 然后尝试使用当前稳定的 PHP 版本进行重现。