2013-01-16 36 views
5

我知道我会耗尽一些东西,因为我正在运行一个很长的任务。这不是问题。我的脚本如何在同一时间耗尽内存和执行时间?

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

Fatal error: Allowed memory size of 805306368 bytes exhausted (tried to allocate 71 bytes) in...

-

Fatal error: Maximum execution time of 300 seconds exceeded in Unknown on line 0

应该不是第一个 “致命” 的错误中止执行,?我正在运行APC和PHP 5.2.6。

编辑: Here is a screenshot

+0

你确定他们是来自同一个脚本?或者最大执行时间错误触发另一个操作,这会导致内存大小错误(通过register_shutdown_function()) – periklis

+6

您可以重现它吗? –

+3

@periklis:不可能。最大执行时间是致命的,并立即杀死脚本。允许更多的代码运行只会允许绕过限制。同样是最大的记忆。 –

回答

4

可能是你正在运行到一个竞争条件在这里。

它基本上适用于例如触发在内存中的关机功能的致命和致命的早期超时触发关机功能:

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在关机功能超时:

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%的解释笨里面发生了什么,但是我想说返回触发execu后的查询时间太长,因此时间限制也是如此。由于您的旧PHP版本,这很难重现。如果我现在评估PHP代码,我会得到代码已被评估的消息,并在哪一行中找到eval命令(PHP 5.4)。尝试使用PHP 5.4重现以获取更多信息。您将从PHP 5.2以来的速度改进中受益匪浅。你错过了很多。

早些时候:

Fatal error: Maximum execution time of 300 seconds exceeded in Unknown on line 0

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

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

但是,如果您可以重现它,请尝试不使用APC。如果仍然可以,请在PHP错误跟踪器中报告。

如果不能,请用APC错误跟踪报告问题。只要看到PHP 5.2.6,你可能需要报告并修复它自己的;虽然;) - 尝试重现与当前稳定的PHP版本以及然后。这可能发生

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(); 
    } 
} 

输出与同你得到了什么:

Fatal error: Allowed memory size of 5242880 bytes exhausted (tried to allocate 524288 bytes) in /home/periklis/workspace/build_script/test.php on line 8

executed

Fatal error: Maximum execution time of 1 second exceeded in /home/periklis/workspace/build_script/test.php on line 13

相关问题