5

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

我只是好奇,我是如何同时得到这两个错误的?

致命错误:允许的内存大小为 805306368 字节已用尽(尝试分配 71 字节)...

--

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

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

编辑: 这是一个截图

4

2 回答 2

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 版本较旧,这有点难以重现。如果我现在 eval PHP 代码,我会收到一条消息,即代码已被 eval'ed 并且我在哪一行中找到了该 eval 命令 (PHP 5.4)。尝试使用 PHP 5.4 重现以获得更多信息。您也将从 PHP 5.2 以来的速度改进中受益匪浅。你错过了很多。

早些时候:

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

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

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

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

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

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

于 2013-01-16T14:52:59.440 回答
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();
    }
}

输出与您得到的相同:

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

执行

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

于 2013-01-16T15:08:48.377 回答