web-dev-qa-db-fra.com

Erreur générique "tué" dans PHP scénario

Je travaille sur un travail CRON qui appelle un script PHP qui effectue beaucoup de travail avec des boucles de base de données.

Il s'exécute correctement lorsque je limite le jeu de données, mais lorsque je l'exécute avec le jeu de données complet, le script génère une erreur avec le message suivant:

Killed

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

Voici la section de 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;
    }
}

La sortie 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 message d'erreur Killed générique et je me demande pourquoi il est tué.

47
Pro777

Vous êtes peut-être en train de déclencher le tueur de mémoire insuffisante (MOO) Linux. Vérifiez dmesg pour les messages à ce sujet. Il dit quel processus a été tué quand cela se produit.

65
Steve Madsen

Moyen simple de reproduire cette erreur Killed:

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

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

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

Exécuter:

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

Le programme prend 100% de la CPU pendant environ 15 secondes, puis s’arrête avec le message Killed. 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 été imprimé "Killed", car il manquait de mémoire en raison 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écoupez le problème en petits morceaux qui fonctionnent de manière séquentielle.
  3. Réécrivez le programme pour qu'il ait moins de besoins en mémoire ou pour éviter la récursion.
15
Eric Leschinski

Dans mon cas sur CloudLinux, PHP 7.1, il s’est produit lorsque 2 processus lisaient et écrivaient dans le même fichier sans verrou.

0
Boy