2009-06-04 14 views
45

Estoy trabajando en un trabajo CRON que invoca un script PHP que hace una gran cantidad de trabajo de base de datos con bucles.Error genérico "asesinado" en el script PHP

se ejecuta correctamente cuando limito el conjunto de datos, pero cuando lo ejecuto contra el conjunto de datos, los errores de script con un mensaje:

Killed 

set_time_limit es (0) y memory_limit es (- 1)

Aquí es donde la sección de código de forma coherente muere:

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 salida tiene el siguiente aspecto:

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 

Nunca he visto este mensaje de error Killed genérico y me pregunto qué está causando su muerte?

Respuesta

62

Es posible que esté desencadenando el asesino de falta de memoria (OOM) de Linux. Compruebe dmesg para saber si hay mensajes sobre él. Dice qué proceso fue asesinado cuando esto sucede.

+3

Gracias por esto.Descubrí que Linux estaba matando el proceso. Lo resolví reduciendo el límite de memoria para PHP en el script, lo que permitió a PHP administrar su memoria de forma diferente y evitar el bloqueo. – Fuser97381

+0

Gracias. Justo lo que necesitaba. – marlar

+0

Para mí, el problema se resolvió mediante la actualización de PHP 5.6 a PHP 7. Obviamente, depende de muchos factores, pero PHP 7 funciona de manera más eficiente, por lo que vale la pena echarle un vistazo. –

11

Una manera sencilla de reproducir este Killed de error:

que fue capaz de reproducir este error en Ubuntu 12.10 con PHP 5.3.10.

crear un script PHP llamado m.php y guárdelo:

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

Run que:

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

El programa se lleva a 100% de la CPU durante unos 15 segundos y luego se detiene con el mensaje Killed. Miran dmesg | grep php y hay pistas:

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

Así que en mi caso, el programa PHP se detuvo y se imprime "muerto", ya que se quedó sin memoria debido a un bucle infinito.

Soluciones:

  1. aumentar la cantidad de memoria RAM disponible o la cantidad de memoria disponible para este programa PHP.
  2. Divida el problema en trozos más pequeños que operan secuencialmente.
  3. Vuelva a escribir el programa para que tenga requisitos de memoria más pequeños o no vaya tan profundo con la recursión.

Cómo no conseguir este problema de nuevo

Si el código que escribió está causando este error y se siente atascado y en una pérdida de por qué lo está haciendo, entonces usted necesita para volver a visitar el comportamiento básico fundamental de las estructuras PHP, bucles y recursión, y cómo se asigna la memoria para satisfacer estos constructos: http://eev.ee/blog/2012/04/09/php-a-fractal-of-bad-design/