2011-03-13 13 views
21

Primero necesito entender cómo funciona Magento cron.¿Cómo probaría cron con Magento?

Sé cómo funciona cron en linux, usando crontab -e.
Sé que necesito configurar cron.php de Magento para ejecutar periódicamente

Pero cuando defino cron dentro del archivo de configuración de 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 funciona?

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

Respuesta

54

El punto de entrada 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 el guión cron.php es golpeado suceden tres cosas:

  • Horario: Magento analiza los config.xml archivos combinados para <config><crontab>...</crontab></config>jobs entradas, la lectura de sus cron_expr elementos para 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 trabajos que deben ejecutarse en este mismo segundo y 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 borrando trabajos que se han completado o perdido (debido a la fecha límite).

Duplicate runs?

Usted plantea un punto interesante. ¿Qué sucede si tiene un cron de 10 minutos programado en Magento, pero solo se garantiza que el cron.php se active cada 15 minutos?Parece que Magento iría en sus puestos de trabajo 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 he leído 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.

probar su código

Si desea probar si su cron está trabajando realmente sin esperar una edad, establezca la cron_expr para ejecutar cada minuto, o limpiar su tabla de programación de cron después haga clic en cron.php dos veces (una vez para generar el cronograma y nuevamente para ejecutar el trabajo).

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

Su pregunta provocó una entrada de blog: https://www.nicksays.co.uk/dissecting-the-magento-cron-system :)

+4

+1 por la minuciosidad. Muy buena (y precisa) información aquí. – shaune

+2

También eche un vistazo a http://www.fabrizio-branca.de/magento-cron-scheduler.html – Alekc

+0

Los enlaces en respuesta no funcionan. ¿Puedes actualizar la respuesta sobre cómo verificar si cron funciona o no? – fresher

7

En la segunda parte de su pregunta ... cómo saber si su funcionamiento.

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.

Por lo tanto, si tengo dudas sobre la ejecución cron, simplemente 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); 
} 
+2

'file_put_contents ('cronlog.txt', fecha ('c'), FILE_APPEND);' – Walf

+0

cuando intenté obtuve 'martes 17 de mayo de 2016 07:12:03 PM' en el archivo cronlog.txt, .means es cron está trabajando en el servidor? – fresher

3

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

8

la adición de estos a la parte inferior de cron.php hará que sea escribir a cabo cron.php.log en 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); 
} 
3

Para probar trabajo cron o no basta con escribir Mage::log('cron working', null, 'cron.log'); al final de el archivo cron.php.

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