it-swarm.com.de

Generischer "Killed" Fehler in PHP Skript

Ich arbeite an einem CRON-Job, der ein PHP-Skript aufruft, das eine Menge Datenbankarbeit mit Schleifen durchführt.

Es wird ordnungsgemäß ausgeführt, wenn ich die Datenmenge einschränke, aber wenn ich es für die vollständige Datenmenge ausführe, wird das Skript mit einer Meldung ausgegeben:

Killed

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

Hier ist der Code-Abschnitt, in dem es ständig 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 folgendermaßen aus:

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

Ich habe diese generische Killed-Fehlermeldung noch nie gesehen und frage mich, was dazu geführt hat, dass sie getötet wurde?

47
Pro777

Möglicherweise lösen Sie den Out-of-Memory (OOM) -Killer von Linux aus. Überprüfen Sie dmesg auf Nachrichten darüber. Es wird angezeigt, welcher Prozess beendet wurde, wenn dies geschieht.

65
Steve Madsen

Einfache Möglichkeit, diesen Killed-Fehler zu reproduzieren:

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

Erstellen Sie ein PHP Skript namens m.php und speichern Sie es:

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

Starte es:

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

Das Programm benötigt für ca. 15 Sekunden 100% CPU und stoppt dann mit der Killed-Meldung. Schau dir dmesg | grep php an und es gibt Hinweise:

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

In meinem Fall wurde das Programm PHP angehalten und "Killed" gedruckt, da der Speicher aufgrund einer Endlosschleife knapp wurde. 

Lösungen:

  1. Erhöhen Sie den verfügbaren RAM oder den für dieses PHP -Programm verfügbaren Speicher.
  2. Unterteilen Sie das Problem in kleinere Abschnitte, die nacheinander ausgeführt werden.
  3. Schreiben Sie das Programm neu, damit der Speicherbedarf geringer ist oder die Rekursion nicht so groß ist.
15
Eric Leschinski

In meinem Fall unter CloudLinux, PHP 7.1, trat es auf, wenn zwei Prozesse in derselben Datei ohne Sperren lesen und schreiben.

0
Boy