2009-06-04 5 views
45

Ich arbeite an einem CRON-Job, der ein PHP-Skript aufruft, das eine Menge Datenbankarbeit mit Schleifen erledigt. richtigGeneric "Killed" -Fehler in PHP-Skript

Es wird ausgeführt, wenn ich den Datensatz zu begrenzen, aber wenn ich es gegen den kompletten Datensatz ausführen, mit einer Nachricht die Skriptfehler aus:

Killed 

set_time_limit ist (0) und memory_limit ist (- 1)

Hier ist der Codeabschnitt, wo es konsequent stirbt:

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

die Ausgabe sieht wie folgt aus:

Ich habe nie diese generischeFehlermeldung gesehen und ich frage mich, was verursacht, dass es getötet wird?

Antwort

62

Möglicherweise lösen Sie den OOM-Killer (Linux Out-of-Memory) aus. Überprüfen Sie dmesg für Nachrichten darüber. Er sagt, welcher Prozess getötet wurde, wenn dies geschieht.

+3

Danke dafür.Ich habe herausgefunden, dass Linux den Prozess umbringt. Ich habe es gelöst, indem ich das Speicherlimit für PHP im Skript reduziert habe, wodurch PHP seinen Speicher anders verwalten und den Absturz vermeiden konnte. – Fuser97381

+0

Danke. Genau das, was ich brauchte. – marlar

+0

Für mich wurde das Problem durch das Upgrade von PHP 5.6 auf PHP 7 gelöst. Offensichtlich hängt es von vielen Faktoren ab, aber PHP 7 arbeitet effizienter, so dass es sich lohnt, es auszuprobieren. –

11

einfache Art und Weise dieses Killed Fehler zu reproduzieren:

konnte ich diesen Fehler reproduzieren auf Ubuntu 12.10 mit PHP 5.3.10.

eine PHP-Skript m.php genannt erstellen und speichern:

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

Run it:

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

Das Programm dauert 100% CPU für etwa 15 Sekunden stoppt dann mit der Killed Nachricht. Schauen Sie sich dmesg | grep php und es gibt Hinweise:

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

Also in meinem Fall, das PHP-Programm angehalten und gedruckt „getötet“, weil es aufgrund einer Endlosschleife aus dem Speicher lief.

Lösungen:

  1. die Menge an RAM verfügbar oder Speichermenge auf dieses PHP-Programm zur Verfügung erhöhen.
  2. Brechen Sie das Problem in kleinere Stücke, die sequentiell arbeiten.
  3. Schreiben Sie das Programm neu, so dass es kleinere Speicheranforderungen hat oder nicht so tief mit Rekursion geht.

Wie dieses Problem nicht wieder bekommen

Wenn der Code, den Sie schrieb diesen Fehler verursacht und Sie fühlen sich fest und an einem Verlust für, warum es es tun, dann müssen Sie erneut besuchen die grundlegendes Kernverhalten von PHP-Strukturen, Schleifen und Rekursion, und wie Speicher zugeordnet ist, um diese Konstrukte zu erfüllen: http://eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design/