Error genérico “asesinado” en script PHP

Estoy trabajando en un trabajo CRON que invoca un script PHP que hace un montón de trabajo de base de datos con bucles.

Se ejecuta correctamente cuando limito el conjunto de datos, pero cuando lo ejecuto contra el conjunto completo de datos, el script se equivoca con un mensaje:

Killed 

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

Aquí está la sección del código donde siempre 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 se ve así:

 I'm in _getMemberDemographicAttrs
I'm leaving _getMemberDemographicAttrs
I'm in _getMemberDemographicAttrs
I'm leaving _getMemberDemographicAttrs
I'm in _getMemberDemographicAttrs
Killed

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

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.

Manera simple de reproducir este error Killed :

Pude reproducir este error en Ubuntu 12.10 con PHP 5.3.10 .

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

  

Ejecutarlo:

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

El progtwig toma 100% de CPU durante aproximadamente 15 segundos y luego se detiene con el mensaje de Killed . Mira dmesg | grep php 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 

Entonces, en mi caso, el progtwig PHP se detuvo e imprimió “Matado” porque se había agotado la memoria debido a un ciclo infinito.

Soluciones:

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

Cómo no volver a tener este problema

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