2009-06-04 13 views
45

Pracuję nad zadaniem CRON, które wywołuje skrypt PHP, który wykonuje wiele operacji bazy danych z pętlami.Ogólny błąd "Zabił" w skrypcie PHP

Wykonuje prawidłowo kiedy ograniczyć zestaw danych, ale gdy uruchamiam go przed pełnym zestawem danych, błędy skryptowe się za pomocą wiadomości:

Killed 

set_time_limit jest (0) i memory_limit jest (- 1)

Oto odcinek kod gdzie konsekwentnie pieczątki:

echo "I'm in _getMemberDemographicAttrs\n"; 
if (! empty ($member_id)) { 
    $query .= ' AND member_id = ' . $member_id; 
} 

$result = mysql_query ($query, $this->_db); 
if ($result) { 
    while ($rule = mysql_fetch_assoc ($result)) { 
     $rules [] = $rule; 
    } 
    if (! empty ($rules)) { 
     mysql_free_result ($result); 
     echo "I'm leaving _getMemberDemographicAttrs\n"; 
     return $rules; 
    } 
} 

Sygnał wyjściowy wygląda następująco:

I'm in _getMemberDemographicAttrs<br/> 
I'm leaving _getMemberDemographicAttrs<br/> 
I'm in _getMemberDemographicAttrs<br/> 
I'm leaving _getMemberDemographicAttrs<br/> 
I'm in _getMemberDemographicAttrs<br/> 
Killed 

Nigdy nie widziałem tego generycznego komunikatu o błędzie Killed i zastanawiam się, co powoduje jego zabicie?

Odpowiedz

62

Możliwe, że uruchamiasz zabójcę nieobecności w pamięci (OOM). Aby uzyskać wiadomości o tym, sprawdź numer dmesg. Mówi, że proces został zabity, gdy tak się stanie.

+3

Dzięki za to.Odkryłem, że Linux zabija ten proces. Rozwiązałem go, redukując limit pamięci dla PHP w skrypcie, co pozwoliło PHP inaczej zarządzać pamięcią i uniknąć awarii. – Fuser97381

+0

Dzięki. Dokładnie to, czego potrzebowałem. – marlar

+0

Dla mnie problem został rozwiązany poprzez uaktualnienie z PHP 5.6 do PHP 7. Oczywiście zależy to od wielu czynników, ale PHP 7 działa wydajniej, więc warto to sprawdzić. –

11

Prosty sposób, aby odtworzyć ten Killed błąd:

udało mi się odtworzyć ten błąd na Ubuntu 12.10 z PHP 5.3.10.

Utwórz skrypt PHP o nazwie m.php i zapisać go:

<?php 
    function repeat(){ 
     repeat(); 
    } 
    repeat(); 
?> 

Uruchom go:

[email protected]:~/foo$ php m.php 
Killed 

Program zajmuje 100% CPU przez około 15 sekund, a następnie zatrzymuje się z komunikatem Killed. Spójrz na dmesg | grep php i istnieją wskazówki:

[email protected]:~/foo$ dmesg | grep php 
[2387779.707894] Out of memory: Kill process 2114 (php) score 868 or 
sacrifice child 

Więc w moim przypadku, program PHP zatrzymany i wydrukowane „zabity”, ponieważ zabrakło pamięci z powodu nieskończonej pętli.

Solutions:

  1. zwiększyć ilość dostępnej pamięci RAM lub ilości pamięci dostępnej do tego programu PHP.
  2. Podziel problem na mniejsze porcje, które działają sekwencyjnie.
  3. Przepisz program, dzięki czemu ma mniejsze wymagania dotyczące pamięci lub nie zagłębia się w rekursję.

Jak nie dostać ten problem ponownie

Jeśli kod napisałeś jest przyczyną tego błędu i czujesz zatrzymany i ze stratą dla dlaczego to robi, to trzeba ponownie odwiedzić podstawowe zachowanie rdzenia struktur, pętli i rekursji PHP oraz sposób alokacji pamięci w celu spełnienia tych konstrukcji: http://eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design/

Powiązane problemy