一部のモジュール(フィード、ルールスケジューラ、リビジョンスケジューラなど)は、hook_cron()
とhook_cron_queue_info()
の両方を実装しています。 Ultimate Cronおよび_Enable cron queue processing
_設定を有効にして使用すると、ジョブリストに2つのジョブが表示されます。両方の仕事が必要ですか?
リビジョンスケジューラモジュールを例にとると、そのhook_cron()
はアイテムをキューに追加するようです:
_function revision_scheduler_cron() {
$ids = db_query("SELECT * FROM {revision_scheduler} WHERE time_scheduled <= :now AND time_queued = 0 AND time_executed = 0 ORDER BY id ASC", array(':now' => REQUEST_TIME))->fetchCol();
if ($operations = revision_scheduler_operation_load_multiple($ids)) {
$queue = DrupalQueue::get('revision_scheduler');
foreach ($operations as $operation) {
if ($queue->createItem($operation)) {
db_update('revision_scheduler')
->fields(array('time_queued' => REQUEST_TIME))
->condition('id', $operation->id)
->execute();
}
}
}
}
_
一方、そのhook_cron_queue_info()
関数は、単一のリビジョン操作を処理する関数を呼び出します。
_function revision_scheduler_cron_queue_info() {
$info['revision_scheduler'] = array(
'worker callback' => 'revision_scheduler_operation_process',
'time' => variable_get('revision_scheduler_cron_time', 30),
);
return $info;
}
_
hook_cron()
が項目をキューに追加し、hook_cron_queue_info()
がそれらを処理するのは事実ですか?
hook_cron_info()
の- documentation は次のように述べています:
同時に実行できるhook_cron()プロセスは1つだけですが、ここで定義されているプロセスはいくつでも実行できます。このため、長時間実行するタスクは、このAPIに適しています。 hook_cron()でキューに入れられたアイテムは、キューに多くのアイテムがない場合、同じcron実行で処理される可能性があります。それ以外の場合は、並行して実行できる複数の要求を受け取る可能性があります。
それをどのように解釈するかはわかりませんが、タスクはどちらかで処理する必要があることを示唆しているようです。
関係は、それらが2つの独立したフックであり、タスクが何であるかに応じて相互に組み合わせて使用できることです。
hook_cron()
:cronイベントに応答するカスタム関数を提供する手段を提供します。
hook_cron_queue_info()
:キューを必要とするcronイベントのキューメタデータを提供する手段を提供します(つまり、制限付きで完全に処理できないタスク) cronイベント中の時間)。
上記の例では:
revision_scheduler_cron
をキューに追加しています。revision_scheduler_cron_queue_info
はキューを処理していません。function(revision_scheduler_operation_process
)処理を呼び出すにはどのくらいの長さ(revision_scheduler_cron_time
)処理のために実行を許可する必要があります。