Kiedy Drupal uruchamia zadania cron, automatycznie obsługuje każdą kolejkę cron zdefiniowaną z modułów, w drupal_cron_run(); pierwsze hook_cron()implementacje są wywoływane, a następnie kolejki cron są opróżniane.
Podczas wdrażania hook_cronapi()możesz dodać wpis dla innej funkcji obsługującej kolejkę cron Twojego modułu.
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);
}
}
}
Alternatywą jest zezwolenie Drupalowi na obsługę kolejki cron, ale dzieje się tak, gdy wykonywane są zadania cron Drupal. Jeśli chcesz częściej opróżniać kolejkę cron swojego modułu, możesz dodać tylko nowe zadanie cron obsługiwane przez moduł Elysia Cron.
Moduł Elysia Cron obsługuje kolejki cron elysia_cron_run(); ta funkcja jest wywoływana z elysia_cron_cron()(implementacja hook_cron()), drush_elysia_cron_run_wrapper()(wywołanie zwrotne komendy Drush) oraz z własnego cron.php . Jeżeli postępujesz zgodnie z instrukcjami w INSTALL.txt pliku (w szczególności w „Etap B: Zmiana systemu crontab (opcja)”), i zastąpić dowolny wywołanie http://example.com/cron.php z http: // przykład .com / sites / all / modules / elysia_cron / cron.php , moduł Elysia Cron powinien już obsługiwać kolejki cron. Kod, który zasugerowałem, może zostać wykorzystany do przyspieszenia obsługi kolejek cron używanych z twojego modułu, jeśli istnieje taka potrzeba.
// 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();
}
}