tengo una tarea programada en PHP que está fallando después de correr durante 29 minutos. El error en el registro (/var/log/php_errors.log
) es:PHP trabajo cron terminación prematura debido al tiempo máximo de ejecución error grave
[01-Mar-2012 00:32:57 UTC] PHP Fatal error: Maximum execution time of 60 seconds exceeded in /path/file.php on line 2079
la entrada de crontab que desencadena el Cron es:
00 00 * * * /usr/bin/php /path/file.php
De mi investigación no creo que esto está relacionado con el ajuste de configuración porque max_execution_time
:
- Sé de hecho que funcionó durante 29:18 minutos (es decir, mucho más de 60 como el mensaje de error).
- De the PHP docs - Cuando se ejecuta PHP desde la línea de comandos de la configuración por defecto es 0.
Q: ¿Por qué está terminando temprano el guión?
Notas:
El guión es muy pesado, y se ejecuta muchos miles de consultas de base de datos, pero yo estaba corriendo top
y la carga de la CPU no era alto.
La línea desde el registro de errores es una llamada mysql_query
:
$sql = "SELECT SUM(amount) FROM mytab WHERE mem = '$id' AND validto > '$now'";
$res = mysql_query($sql);
> php -v
PHP 5.3.10 (cli) (built: Feb 2 2012 17:34:38)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies
with Suhosin v0.9.33, Copyright (c) 2007-2012, by SektionEins GmbH
> cat /etc/redhat-release
Red Hat Enterprise Linux Server release 5.7 (Tikanga)
actualización - descubrí por qué la secuencia de comandos puede funcionar durante 29 minutos de tiempo real, pero PHP puede salir citando el tiempo de ejecución mucho más bajo.
Cualquier tiempo dedicado a actividades que ocurran fuera de la ejecución del script como llamadas al sistema usando system(), operaciones de flujo, consultas de bases de datos, etc. no se incluye al determinar el tiempo máximo que el script se ha estado ejecutando .
(de the set_time_limit() docs, pero también se menciona en the max-execution-time docs). Esto fue relevante para mí porque la mayor parte del script llevaba mucho tiempo ejecutando consultas db y llamadas a la API de pago que no habrían estado cronometrando el tiempo de ejecución.
el trabajo cron no tiene nada que ver con su error, este es un problema puro de PHP. verifique si hay pérdidas de memoria, intente desarmar algunas de las matrices de fallas después de ejecutar los bucles. libere otras grandes variables entre consultas. –
También notará en la documentación que dice: _el tiempo máximo de ejecución no se ve afectado por llamadas al sistema, operaciones de flujo, etc._. ¿Puedes asegurarte de que es de hecho el PHP _CLI_ que dispara el cron? –
También verificaría que tenga índices adecuados para acelerar la selección. ¿Tienes un índice de *** mem *** y *** validto ***? –