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이 크론 대기열을 처리하도록하는 것이지만 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의 파일 (에 특히 "를 B 단계 : 변경 시스템의 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();
}
}