Drupalがcronタスクを実行すると、モジュールから定義されたcronキューが自動的に処理されます。 drupal_cron_run()
ます; 最初のhook_cron()
実装が呼び出され、次にcronキューが空になります。
実装する hook_cronapi()
、モジュールのcronキューを処理する別の関数のエントリを追加できます。
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);
}
}
}
別の方法は、Drupalにcronキューを処理させることですが、これはDrupal cronタスクが実行されるときに起こります。モジュールのcronキューをより頻繁に空にする場合は、Elysia Cronモジュールによって処理される新しいcronタスクのみを追加できます。
Elysia Cronモジュールはcronキューを処理しますelysia_cron_run()
; この関数は、elysia_cron_cron()
(の実装hook_cron()
)、drush_elysia_cron_run_wrapper()
(Drushコマンドコールバック)、および独自のcron.phpから呼び出されています。あなたはの指示に従っていればいるinstall.txtファイル(に特にを「STEPのB:CHANGE SYSTEM CRONTAB(オプション)」)、および任意の呼び出しに置き換えhttp://example.com/cron.phpをします。http://例.com / sites / all / modules / elysia_cron / cron.php、Elysia Cronモジュールはすでにcronキューを処理しているはずです。私が提案したコードは、モジュールから使用されるcronキューの処理を高速化するために使用できます(そうする必要がある場合)。
// 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();
}
}