2013-01-16 11 views
5

Wiedziałem, że zabraknie mi czegoś, ponieważ wykonywałem bardzo długie zadanie. To nie problem.W jaki sposób mój skrypt stracił pamięć i czas wykonania w tym samym czasie?

Jestem po prostu ciekawy, w jaki sposób otrzymałem oba błędy w tym samym czasie?

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

nie powinien pierwszy "fatal" wykonanie błędu zatrzymania? Używam APC i php 5.2.6.

EDIT: Here is a screenshot

+0

Czy jesteś pewien, że są z tego samego skryptu?A może maksymalny błąd czasu wykonania wyzwala kolejną akcję, która powoduje błąd rozmiaru pamięci (poprzez register_shutdown_function()) – periklis

+6

Czy możesz go odtworzyć? –

+3

@periklis: niemożliwe. max czas exec jest krytyczny i natychmiast zabija skrypt. zezwolenie na uruchomienie kodu MORE po prostu pozwoliłoby na obejście limitu. ditto dla maksymalnej pamięci. –

Odpowiedz

4

To może być że używasz do wyścigu warunku tutaj.

To w zasadzie działa na przykład wyzwalającego śmiertelna w funkcji wyłączania dla pamięci i śmiertelna dla timeout wcześniejszym wyzwalającego funkcję wyłączania:

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

To działa również w drugą stronę, najpierw wyzwalanie śmiertelnych dla pamięci, a następnie śmiertelne dla timeout w funkcji wyłączania:

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

to jeszcze nie w 100% wyjaśnić, co dzieje się wewnątrz CodeIgniter jednak powiedziałbym zapytanie trwa zbyt długo, dlatego po powrocie wyzwalanie wykonanie dane także ograniczenia czasowe. Jest to nieco trudne do odtworzenia ze względu na twoją starszą wersję PHP. Jeśli teraz zajmiemy się kodem PHP, otrzymam wiadomość, że kod został sprawdzony iw której wierszu znajduję tę komendę eval (PHP 5.4). Spróbuj odtworzyć z PHP 5.4, aby uzyskać więcej informacji. Zyskasz także znaczne korzyści z ulepszeń prędkości, które zaobserwowaliśmy od PHP 5.2. Tęsknisz za dużo.

Wcześniej:

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

To pachnie błędu startowego.

To, co spowodowało twój pierwszy błąd, trudno powiedzieć, przerwałeś to. Albo masz tutaj eval'ed kod, który mógł być częściowo obsłużony przez APC, w tym samym skrypcie można zobaczyć dwa fatalne błędy.

Spróbuj jednak bez APC, jeśli możesz go odtworzyć. Jeśli nadal możesz, zgłoś to w bugtracker PHP.

Jeśli nie możesz, zgłoś problem za pomocą modułu śledzącego APC.

Edit: Tylko widząc PHP 5.2.6, być może trzeba zgłosić i naprawić własne chociaż;) - Spróbuj odtworzyć z aktualnej wersji stabilnej, a następnie PHP.

0

Jednym ze sposobów, że to może się zdarzyć, to jeśli masz 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(); 
    } 
} 

wyjść samo z co masz:

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

Powiązane problemy