Tengo una tarea que tarda unos 45 minutos en completarse y debe realizarse todos los días (sincronización de usuarios con varias bases de datos externas, etc.).
Para manejar el trabajo, he configurado una cola cron con hook_cron_queue_info()
lo siguiente:
function mymodule_cron_queue_info() {
$queues = array();
$queues['update_users_queue'] = array(
'worker callback' => '_mymodule_process_user_queue_item',
'time' => 120,
);
return $queues;
}
Lleno la cola usando esta función:
function mymodule_queue_all_users_for_synching() {
//...query for users...
$queue = DrupalQueue::get('update_users_queue');
foreach($users as $user) {
$queue->createItem($user);
}
}
La función de llenado de cola se llama como una tarea cron. Uso Elysia Cron , por lo que mi implementación de hook_cronapi()
es:
function mymodule_cronapi($op, $job = NULL) {
$items = array();
$items['queue_users_for_synch'] = array(
'description' => 'Queue all user accounts for synching.',
'rule' => '0 3 * * *', // Run this job every day at 3am.
'callback' => 'mymodule_queue_all_users_for_synching',
);
return $items;
}
La función de trabajo para cada elemento de la cola, definida en mymodule_cron_queue_info
es como:
function _mymodule_process_user_queue_item($item) {
//...synchronize user ($item)...
}
Mi pregunta es, ¿ cuándo cron realmente comenzará a procesar la cola?
Supongamos que lleno la cola todos los días a las 3 a.m. y quiero procesarla 120 segundos de cada 30 minutos hasta que esté lista. ¿Necesito crear otra tarea cron?
Respuestas:
Cuando Drupal ejecuta tareas cron, maneja automáticamente cualquier cola cron definida a partir de módulos, en
drupal_cron_run()
; primerohook_cron()
se invocan implementaciones y luego se vacían las colas cron.Por ejemplo
hook_cronapi()
, puede agregar una entrada para otra función que maneja la cola cron de su módulo.La alternativa es dejar que Drupal maneje la cola cron por usted, pero eso sucede cuando se ejecutan las tareas cron de Drupal. Si desea vaciar la cola cron de su módulo con más frecuencia, solo puede agregar una nueva tarea cron manejada por el módulo Elysia Cron.
El módulo Elysia Cron maneja las colas cron en
elysia_cron_run()
; esta función se invoca desdeelysia_cron_cron()
(una implementación dehook_cron()
),drush_elysia_cron_run_wrapper()
(una devolución de llamada de comando Drush) y desde su propio cron.php . Si siguió las instrucciones en el archivo INSTALL.txt (en particular en "PASO B: CAMBIO DE CRONTAB DEL SISTEMA (OPCIONAL)") y reemplazó cualquier invocación de http://example.com/cron.php con http: // ejemplo .com / sites / all / modules / elysia_cron / cron.php , el módulo Elysia Cron ya debería estar manejando las colas cron. El código que sugerí podría usarse para acelerar el manejo de las colas cron utilizadas desde su módulo, si efectivamente existe la necesidad de hacerlo.fuente
cron.php
? Si ese es el caso, eso sucede cada minuto (vea mi primer comentario sobre la respuesta de @ David).elysia_cron_run
con colas cron que se procesan automáticamente cada vez que se solicita cron.php de Elysia.La cola se completará a través del gancho Elysia cronapi a la hora establecida.
Sin embargo, la cola se procesará siempre que se produzca la ejecución estándar de Drupal cron.
Vea este fragmento de procesamiento de devolución de llamada de trabajo al final del núcleo: drupal_cron_run
fuente
cron.php
script de Elysia cada minuto , lo que le permite a Elysia controlar los tiempos de las tareas con una resolución minuto a minuto. Sin embargo, ninguna tarea se ejecuta cada minuto, ¿qué es lo que me hizo pensar que necesitaba crear una tarea para trabajar específicamente en colas?drupal_cron_run
se llame, se procesará la devolución de llamada del trabajador de la cola cron.drupal_cron_run
no se llama desde elcron.php
script Elysia (cuando Elysia está habilitado);elysia_cron_run
se usa en su lugar.hook_cron_queue_info
con Elysia cron, a menos que especifique su propia devolución de llamada de trabajo, según eldrupal_cron_run
fragmento de función principal anterior.elysia_cron_run
no llamadrupal_cron_run
, pero se hace la llamadamodule_invoke_all('cron_queue_info')
y hace unos pantalones de fantasía manejo que hace que el humo salga mis oídos multicanal.como se indicó anteriormente al usar Elysia Cron, sus colas no se procesan.
usted (y drupal) no tienen acceso a las colas que de otro modo se ejecutarían en drupal_run_cron
la solución consiste en crear una tarea cron personalizada (esto será visible para elysia cron) para procesar todas las colas o una que desee e invocar el procesamiento de colas allí. es decir:
ahora el procesamiento de colas puede ser controlado por ElysiaCron
fuente
No uso Elysia, pero mi solución siempre ha sido algo como esto:
Solo maneja un elemento, para cada ejecución cron. Tal vez quieras cambiar eso.
fuente
También he estado tratando de entender esto, ya que estoy usando la API de cola por primera vez junto con Elysia cron. Tras una inspección más cercana, puede ver que Elysia cron ejecuta elementos de la cola cuando se llama a la función elysia_cron_run . Vea este fragmento de la línea 1044 dentro del archivo elysia_cron.module :
Esto me ayudó a desmitificar el procesamiento de colas cuando utilicé Elysia cron.
fuente