Khi Drupal chạy các tác vụ cron, nó sẽ tự động xử lý bất kỳ hàng đợi cron nào được xác định từ các mô-đun, trong drupal_cron_run()
; hook_cron()
triển khai đầu tiên được gọi, và sau đó hàng đợi cron được làm trống.
Đang thực hiện hook_cronapi()
, bạn có thể thêm một mục nhập cho một chức năng khác xử lý hàng đợi cron của mô-đun của bạn.
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);
}
}
}
Cách khác là để Drupal xử lý hàng đợi cron cho bạn, nhưng điều đó xảy ra khi các tác vụ cron Drupal được thực thi. Nếu bạn muốn làm trống hàng đợi cron của mô-đun của bạn thường xuyên hơn, bạn chỉ có thể thêm một tác vụ cron mới được xử lý bởi mô-đun Elysia Cron.
Mô-đun Elysia Cron xử lý các hàng đợi cron trong elysia_cron_run()
; Chức năng này đang được gọi từ elysia_cron_cron()
(một thực hiện hook_cron()
), drush_elysia_cron_run_wrapper()
(một lệnh Drush gọi lại), và từ riêng của mình cron.php . Nếu bạn đã làm theo các hướng dẫn trong tệp INSTALL.txt (cụ thể là trong "BƯỚC B: THAY ĐỔI HỆ THỐNG CRONTAB (TÙY CHỌN)") và thay thế bất kỳ lời mời nào của http://example.com/cron.php bằng http: // ví dụ .com / site / all / module / elysia_cron / cron.php , mô-đun Elysia Cron nên đã xử lý các hàng đợi cron. Mã tôi đề xuất có thể được sử dụng để tăng tốc độ xử lý hàng đợi cron được sử dụng từ mô-đun của bạn, nếu thực sự cần phải làm như vậy.
// 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();
}
}