54 votes

Erreur générique "Killed" dans le script de PHP

Je travaille sur une tâche CRON qui invoque un script PHP script qui fait beaucoup de travail de base de données avec des boucles.

Il s'exécute correctement lorsque je limite l'ensemble de données, mais lorsque je l'exécute par rapport à l'ensemble de données complet, le script s'interrompt avec un message :

Killed

set_time_limit est (0) et memory_limit est (-1)

Voici la section du code où il meurt systématiquement :

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

Le résultat ressemble à ceci :

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

Je n'ai jamais vu ce générique Killed et je me demande ce qui fait qu'il est tué ?

0 votes

Je viens de recevoir cette erreur en PHP 7.4, et le coupable est une classe anonyme qui surcharge une méthode. J'ai ajouté un paramètre à la méthode de base dans la classe parent, mais j'ai oublié le paramètre dans la classe enfant anonyme. Pour une raison quelconque, PHP n'a pas analysé cela correctement et a monopolisé la mémoire jusqu'à ce que l'erreur OOM se produise. Killed le processus. L'ajout du paramètre manquant à la classe anon a réglé le problème. Pour être honnête, cela ressemble à un bug de PHP.

78voto

Steve Madsen Points 7265

Vous pourriez déclencher le tueur de Linux out-of-memory (OOM). Vérifiez dmesg pour les messages à ce sujet. Il indique quel processus a été tué lorsque cela se produit.

4 votes

Merci pour ça. J'ai découvert que Linux tuait le processus. Je l'ai résolu en réduisant la limite de mémoire pour PHP dans le script, ce qui a permis à PHP de gérer sa mémoire différemment et d'éviter le crash.

0 votes

Merci. Juste ce dont j'avais besoin.

0 votes

Pour moi, le problème a été résolu en passant de PHP 5.6 à PHP 7. Évidemment, cela dépend de nombreux facteurs, mais PHP 7 est plus efficace et vaut la peine d'être vérifié.

17voto

Eric Leschinski Points 14289

Un moyen simple de reproduire ce phénomène Killed erreur :

J'ai pu reproduire cette erreur sur Ubuntu 12.10 avec PHP 5.3.10 .

Créez un script PHP appelé m.php et le sauvegarder :

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

Exécutez-le :

el@apollo:~/foo$ php m.php
Killed

Le programme utilise 100 % du CPU pendant environ 15 secondes, puis s'arrête avec l'indication Killed message. Regardez dmesg | grep php et il y a des indices :

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

Donc, dans mon cas, le programme PHP s'est arrêté et a imprimé "Killed" parce qu'il manquait de mémoire à cause d'une boucle infinie.

Solutions :

  1. Augmentez la quantité de RAM disponible ou la quantité de mémoire disponible pour ce programme PHP.
  2. Décomposez le problème en petits morceaux qui fonctionnent de manière séquentielle.
  3. Réécrivez le programme de façon à ce qu'il ait besoin de moins de mémoire ou qu'il ne soit pas trop récursif.

0voto

Borna Points 760

Dans mon cas, sur CloudLinux, avec PHP 7.1, cela s'est produit lorsque deux processus lisaient et écrivaient dans le même fichier sans verrou.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X