Quando Drupal esegue attività cron, gestisce automaticamente qualsiasi coda cron definita dai moduli, in drupal_cron_run()
; hook_cron()
vengono invocate le prime implementazioni, quindi vengono svuotate le code cron.
Grazie all'implementazione hook_cronapi()
, puoi aggiungere una voce per un'altra funzione che gestisce la coda cron del tuo modulo.
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);
}
}
}
L'alternativa è consentire a Drupal di gestire la coda cron per te, ma ciò accade quando vengono eseguite attività cron di Drupal. Se si desidera svuotare la coda cron del modulo più frequentemente, è possibile solo aggiungere una nuova attività cron gestita dal modulo Elysia Cron.
Il modulo Elysia Cron gestisce le code cron elysia_cron_run()
; questa funzione viene invocata da elysia_cron_cron()
(un'implementazione di hook_cron()
), drush_elysia_cron_run_wrapper()
(un callback del comando Drush) e dal suo stesso cron.php . Se hai seguito le istruzioni nel file INSTALL.txt (in particolare in "PASSAGGIO B: MODIFICA CRONTAB DI SISTEMA (OPZIONALE)") e hai sostituito qualsiasi invocazione di http://example.com/cron.php con http: // esempio .com / sites / all / modules / elysia_cron / cron.php , il modulo Elysia Cron dovrebbe già gestire le code cron. Il codice che ho suggerito potrebbe essere usato per velocizzare la gestione delle code cron utilizzate dal tuo modulo, se ce n'è effettivamente bisogno.
// 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();
}
}