Tengo dificultades para configurar un trabajo de Cron para que se ejecute una vez al día a una hora determinada. Aquí es lo que tengo en la configuración de mi módulo:¿El Cron de Magento es fundamentalmente defectuoso?
<crontab>
<jobs>
<sorting_flushcache>
<schedule><cron_expr>0 16 * * *</cron_expr></schedule>
<run><model>sorting/observer::flushProductCacheCron</model></run>
</sorting_flushcache>
</jobs>
</crontab>
Por lo que sé acerca de los trabajos de cron, que debe funcionar a 17:00 basada en mi zona horaria local. Sin embargo, NUNCA funciona. Si en su lugar configuro cron_expr en * 16 * * *
, programa un trabajo cada minuto durante toda la hora (como era de esperar).
he seguido a través del código y creo que he encontrado el problema, pero no sé lo suficiente sobre la programación de cron y cómo esto es realmente supuesta a trabajar, así que espero que alguien pueda ayudar a entender lo que está mal y cómo para hacer que mi trabajo funcione
Mage_Cron_Model_Schedule es el cerebro de la bestia. Cuando la secuencia de comandos crontab del servidor llama al script cron.php, distribuye un evento que atrapa a esta clase y lo hace. Entre otras cosas, extrae la configuración e intenta programar los próximos trabajos cron. Dentro de public function trySchedule($time)
llama al matchCronExpression
, pasándole la pieza de la expresión cron en cuestión junto con el valor de la hora actual correspondiente a esa parte de la expresión cron. Por ejemplo, compara la primera parte de cron_expr (minutos parte) con los minutos de la marca de tiempo actual. Al final de la función matchCronExpression
devuelve un valor booleano de este modo:
return ($num>=$from) && ($num<=$to) && ($num%$mod===0);
En mi caso, mi cron_expr es 0 16 * * *
. Como no tengo rangos ni */5
cosas de tipo para mi minutos, está comparando el valor exacto que establezco con el valor exacto de la marca de tiempo actual. Esto significa que SÓLO se devolverá verdadero si se ejecutó el script cron en el minuto exacto en que se debe programar este trabajo.
Una vez más, no soy un cron experto pero esto no me parece correcto. Entonces, ¿cómo se supone que debe programarse un trabajo para ejecutarse una vez al día si no puede predecir el minuto exacto en que el programador cron ejecutará el script? Realmente espero haberme perdido algo ... ¿alguien puede ayudarme?
- CRON CONFIG INFO -
generate schedules every: 5
schedule ahead for: 10
missed if not run within: 20
success history lifetime: 60
failure history lifetime: 600
Huso horario del servidor, no es la zona horaria local. – hakre
Como sea, ese no es el punto. Como mencioné en mi publicación, si lo cambio a '* 16 * * *' funciona ... así que no es la semántica de la zona horaria en la que dije que la basé. Simplemente no funciona. – BrianVPS
Sí, parece roto. Pero lo que leí, la calidad del código de magneto no está bien. Probablemente solo sea una mierda para impulsar el lanzamiento y hacer que se vea sexy para ser vendido rápidamente. – hakre