cronjob php testing magento cron

php - cronjob - crontab magento 2



¿Cómo probaría cron con Magento? (5)

Primero necesito entender cómo funciona Magento cron.

Sé cómo funciona cron en Linux, usando crontab -e .
Sé que necesito configurar el cron.php de Magento para que se ejecute periódicamente

Pero cuando defino cron dentro del archivo de configuración magento, ¿cómo coinciden con que deberían ejecutarse?

Porque si configuro mi cron.php para que se ejecute cada 15 minutos ( 0,15,30,45 * * * * ) y tengo un cron de Magento <schedule><cron_expr>10 * * * *</cron_expr></schedule> por ejemplo.

¿Cómo coincidirá / funcionará?

Por cierto, ¿cómo podría probar que mi cron funciona sin esperar mucho tiempo?


El punto de entrada de cron de Magento es el script cron.php en su raíz de Magento. Tendrá que configurar una entrada de crontab del sistema operativo para ejecutar este script, que parece que ya lo hizo.

Cómo funciona el cron

Cada vez que se cron.php script cron.php suceden tres cosas:

  • Calendario : Magento analiza los archivos config.xml combinados para las entradas de jobs <config><crontab>...</crontab></config> , leyendo sus elementos cron_expr para obtener detalles sobre la frecuencia con la que deben ejecutarse. Magento rellena la tabla de programación cron con trabajos que se deben ejecutar en el futuro, junto con las marcas de tiempo para cuando se deben ejecutar. La extensión en el futuro que Magento hace esto es configurable en el administrador.
  • Ejecutar : Magento lee la tabla de programación cron para los trabajos que deben ejecutarse en este mismo segundo y los trabajos que ya deberían haberse ejecutado, es decir, con marcas de tiempo en el pasado, que no han expirado. El límite de caducidad también es un parámetro configurable en el administrador.
  • Limpieza : Magento revisa la tabla de programación eliminando trabajos que se han completado o perdido (debido a la fecha límite).

¿Carreras duplicadas?

Usted plantea un punto interesante. ¿Qué sucede si tienes un cron de 10 minutos programado en Magento, pero cron.php solo se garantiza que se cron.php cada 15 minutos? Parece que Magento ejecutará tus trabajos de Magento dos veces, en algunos casos:

  • HH: 00 -> HH: 50 y HH: 00
  • HH: 15 -> HH: 10
  • HH: 30 -> HH: 20 y HH: 30
  • HH: 45 -> HH: 40

Solo leí el código, y eso es lo que parece suceder. La mejor forma de averiguarlo sería, por supuesto, ejecutarlo y descubrirlo. Si desea evitar el problema, en la mayoría de los casos, aumente la frecuencia de ejecución de cron.php a cada 5 minutos, que es lo que hacemos.

Probando tu código

Si quiere probar si su cron realmente está funcionando sin esperar una edad, configure cron_expr para que ejecute cada minuto, o borre la tabla de programación cron y luego cron.php dos veces (una para generar el cronograma y nuevamente para ejecutar el trabajo) )

Si solo quiere probar que su modelo está funcionando, puede configurar un script de prueba (descrito en https://www.nicksays.co.uk/testing-magento-modules ) y ejecutarlo.

Su pregunta provocó una publicación en el blog: https://www.nicksays.co.uk/dissecting-the-magento-cron-system :)


En la segunda mitad de su pregunta ... cómo saber si se está ejecutando.

Aquí hay algo que hice. Agregué el siguiente código al final del archivo cron.php. Esto actualiza un registro simple llamado "cronlog.txt" cada vez que se llama al archivo cron.php.

Entonces, si tengo dudas sobre la ejecución de cron, solo puedo echar un vistazo a ese archivo y ver la última fecha y hora en que se ejecutó el archivo cron.php.

try { $myFile = "cronlog.txt"; $fh = fopen($myFile, ''w''); $stringData = date(''l jS /of F Y h:i:s A''); fwrite($fh, $stringData); fclose($fh); } catch (Exception $e) { Mage::printException($e); }


Para probar cron trabajando o no, simplemente puede escribir Mage::log(''cron working'', null, ''cron.log''); al final del archivo cron.php.

Si el cron está funcionando, creará un archivo cron.log en su directorio base.


Si está en GNU / Linux, puede verificar /var/log/syslog y filtrar las cronjobs usando grep . Para ver una lista de todos los cronjobs que se ejecutaron, escriba grep ''cron'' /var/log/syslog .


agregar estos a la parte inferior de cron.php lo hará escribir cron.php.log en la ejecución con la fecha y hora

try { Mage::getConfig()->init()->loadEventObservers(''crontab''); Mage::app()->addEventArea(''crontab''); Mage::dispatchEvent(''default''); $log = fopen(__FILE__.''.log'', ''a''); fwrite($log, date("Y-m-d H:i:s").PHP_EOL); fclose($log); } catch (Exception $e) { Mage::printException($e); }