Tengo un script PHP que toma un fragmento de datos de una base de datos, lo procesa y luego mira para ver si hay más datos. Este proceso se ejecuta indefinidamente y ejecuto varios de estos a la vez en un único servidor.Práctica recomendada para encontrar el origen de la terminación del script PHP
se ve algo como:
<?php
while($shouldStillRun)
{
// do stuff
}
logThatWeExitedLoop();
?>
El problema es, después de algún tiempo, algo que hace que el proceso de dejar de correr y no he sido capaz de depurar el organismo y determinar la causa.
Esto es lo que estoy usando para obtener información hasta el momento:
- error_log - Registro de todos los errores, pero no hay errores se muestran en el registro de errores.
- register_shutdown_function - Ha registrado una función de apagado personalizado. Esto se llama así que sé que el servidor no está matando el proceso, se le permite terminar. (o al menos supongo que es el caso de este ser llamado?)
- debug_backtrace - registra un debug_backtrace() en mi función de desconexión personalizado. Esto muestra solo una llamada y es mi función de apagado personalizado.
- Registro si llega al final de la secuencia de comandos - Fuera del ciclo, tengo una función que registra que la secuencia de comandos salió del bucle (y por lo tanto estaría llegando al final del archivo de origen normalmente). Cuando la secuencia de comandos muere aleatoriamente, no está registrando esto, por lo que lo mata, lo mata mientras está en el medio del procesamiento.
¿Qué otros métodos de depuración sugerirías para encontrar al culpable?
Nota: Debo añadir que esto no es un problema con max_execution_time, que está deshabilitado para estos scripts. El tiempo antes de ser asesinado es inconsistente. Podría correr durante 10 segundos o 12 horas antes de que muera.
actualización/Solución: Gracias a todos por sus sugerencias. Al registrar el resultado, descubrí que cuando fallaba una consulta MySql, el script se configuraba en die(). D'oh. Se actualizó para registrar los errores de mysql y luego finalizar. Lo tengo funcionando ahora como un encanto!
http://www.php.net/manual/en/features.connection-handling.php dice "Cuando el temporizador caduque, la secuencia de comandos se cancelará y, como en el caso anterior de desconexión del cliente, si se ha desactivado la función de apagado. registrado se llamará ". por lo que su declaración "Esto se llama así que sé que el proceso no está siendo matado por el servidor", probablemente sea falso. –
Como habrás notado, debug_backtrace es inútil en una función de apagado, porque la función de apagado tiene una pila de llamadas separada de lo que sea que provocó su activación. – Piskvor