Cuando Drupal ejecuta tareas cron, maneja automáticamente cualquier cola cron definida a partir de módulos, en drupal_cron_run()
; primero hook_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.
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',
);
$items['clean_queue'] = array(
'description' => 'Clean the queue for the user synching.',
'rule' => '0 4 * * *', // Run this job every day at 4 AM.
'callback' => 'mymodule_clean_queue',
);
return $items;
}
function mymodule_clean_queue() {
$queues = module_invoke('mymodule', 'cron_queue_info');
drupal_alter('cron_queue_info', $queues);
// Make sure every queue exists. There is no harm in trying to recreate an
// existing queue.
foreach ($queues as $queue_name => $info) {
DrupalQueue::get($queue_name)->createQueue();
}
foreach ($queues as $queue_name => $info) {
$function = $info['worker callback'];
$end = time() + (isset($info['time']) ? $info['time'] : 15);
$queue = DrupalQueue::get($queue_name);
while (time() < $end && ($item = $queue->claimItem())) {
$function($item->data);
$queue->deleteItem($item);
}
}
}
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 desde elysia_cron_cron()
(una implementación de hook_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.
// This code is part of the code executed from modules/elysia_cron/cron.php.
define('DRUPAL_ROOT', getcwd());
include_once DRUPAL_ROOT . '/includes/bootstrap.inc';
drupal_override_server_variables(array(
'SCRIPT_NAME' => '/cron.php',
));
drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
if (!isset($_GET['cron_key']) || variable_get('cron_key', 'drupal') != $_GET['cron_key']) {
watchdog('cron', 'Cron could not run because an invalid key was used.', array(), WATCHDOG_NOTICE);
drupal_access_denied();
}
elseif (variable_get('maintenance_mode', 0)) {
watchdog('cron', 'Cron could not run because the site is in maintenance mode.', array(), WATCHDOG_NOTICE);
drupal_access_denied();
}
else {
if (function_exists('elysia_cron_run')) {
elysia_cron_run();
}
else {
drupal_cron_run();
}
}