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 dejobs
<config><crontab>...</crontab></config>
, leyendo sus elementoscron_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);
}