2012-04-19 18 views
5

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 
+0

Huso horario del servidor, no es la zona horaria local. – hakre

+0

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

+0

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

Respuesta

3

que puede haber encontrado una "solución" a este problema, pero no estoy seguro de que el posible impacto que esto podría tener. Con suerte, alguien más puede responder para confirmar o proporcionar una mejor respuesta.

he cambiado de Cron Config en Magento de la siguiente manera:

generate schedules every: 1 
schedule ahead for: 5 
missed if not run within: 20 
history cleanup every: 30 
success history lifetime: 60 
failure history lifetime: 600 

Esto parece haber hecho el truco. Ahora genera horarios cada minuto para que no pierda la ventana para programar mi evento de una vez al día.

¿Alguna idea de esto? Me preocupa que sea demasiado para que el sistema genere cronogramas cron a cada minuto. Debería poder manejarlo, pero tendré que hacer pruebas para confirmarlo.

¿Alguien más tiene una experiencia similar? ¿Cómo lo resolvió?

+0

Bueno, esto hizo que las entradas comenzaran a aparecer en la tabla cron_schedule pero no está ejecutando mi código correctamente. El método en mi modelo llamado por cron es ** flushProductCacheCron **. Después de que se ejecuta, compruebo la base de datos y ha actualizado mi tabla para reflejar que ha procesado los elementos que necesitaban procesarse, pero que en realidad nunca ha limpiado la memoria caché. ¿Existen limitaciones en cuanto a qué código puede ejecutar un trabajo cron? Para probar configuré un controlador frontend para llamar al mismo método llamado por cron. Cuando cargo esa URL, funciona correctamente. Solo cron tiene el problema. ¿Que está pasando aqui? – BrianVPS

Cuestiones relacionadas