我的脚本是如何同时耗尽内存和执行时间的?

时间:2013-01-16 14:48:00

标签: php

我知道我会用完一些东西,因为我的任务很长。那不是问题。

我只是好奇,我是怎么同时得到两个错误的?

  

致命错误:允许的内存大小耗尽805306368个字节(尝试过   在...中分配71个字节)

-

  

致命错误:未知中超过300秒的最长执行时间   在第0行

第一个“致命”错误不应该停止执行吗?我正在运行APC和php 5.2.6。

编辑: Here is a screenshot

2 个答案:

答案 0 :(得分:4)

可能是你在这里遇到了竞争条件。

它基本上可以用于例如在内存的关闭函数中触发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);

它也可以反过来工作,首先触发内存的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);

这还没有100%解释Codeigniter中发生了什么,但是我会说查询花费的时间太长因此在返回触发执行时间限制之后也是如此。由于您的旧版PHP版本,这有点难以重现。如果我现在评估PHP代码,我会收到代码被评估的消息,以及我在哪一行找到eval命令(PHP 5.4)。尝试使用PHP 5.4重现以获取更多信息。自PHP 5.2以来我们所看到的速度提升也将大大受益。你错过了很多。

早些时候:

  

致命错误:第0行的未知数超过300秒的最长执行时间

这闻起来像是一个启动错误。

什么引发了你的第一个错误很难说,你切断了它。要么你在这里得到了eval'代码,这些代码可能是通过APC部分处理的,你可以在同一个脚本中看到两个致命的错误。

但是,如果您可以重现,请尝试不使用APC。如果你仍然可以,请在PHP bugtracker中报告。

如果你不能,请用APC bugtracker报告问题。

编辑:只是看到PHP 5.2.6,您可能需要自己报告并修复它;) - 尝试使用当前稳定的PHP版本重现。

答案 1 :(得分:0)

如果您有register_shutdown_function:

,可能会发生这种情况
<?php
register_shutdown_function('shutdownFunction');
error_reporting(E_ALL);ini_set("display_errors", true);
ini_set("memory_limit", "5M");
ini_set("max_execution_time", 1);

for ($i=0;$i<1000000;$i++) {
    $val[] = rand();
}

function shutDownFunction() {
    echo "executed";
    for ($i=0;$i<100000000;$i++) {
        $val = rand();
    }
}

输出与你得到的相同:

  

致命错误:允许的内存大小耗尽5242880字节(尝试过   分配524288字节)   第8行/home/periklis/workspace/build_script/test.php

     

执行

     

致命错误:超过1秒的最长执行时间   第13行/home/periklis/workspace/build_script/test.php