Saya punya tugas yang membutuhkan waktu sekitar 45 menit untuk diselesaikan dan perlu terjadi setiap hari (menyinkronkan pengguna ke beberapa basis data eksternal, dll).
Untuk menangani pekerjaan, saya telah menyiapkan antrian cron dengan hook_cron_queue_info()
sebagai berikut:
function mymodule_cron_queue_info() {
$queues = array();
$queues['update_users_queue'] = array(
'worker callback' => '_mymodule_process_user_queue_item',
'time' => 120,
);
return $queues;
}
Saya mengisi antrian menggunakan fungsi ini:
function mymodule_queue_all_users_for_synching() {
//...query for users...
$queue = DrupalQueue::get('update_users_queue');
foreach($users as $user) {
$queue->createItem($user);
}
}
Fungsi mengisi antrian dipanggil sebagai tugas cron. Saya menggunakan Elysia Cron , jadi implementasi saya hook_cronapi()
adalah:
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',
);
return $items;
}
Fungsi pekerja untuk setiap item antrian, didefinisikan dalam mymodule_cron_queue_info
seperti:
function _mymodule_process_user_queue_item($item) {
//...synchronize user ($item)...
}
Pertanyaan saya adalah, kapan sebenarnya cron akan mulai memproses antrian?
Katakanlah saya mengisi antrian setiap hari jam 3 pagi, dan ingin memprosesnya 120 detik dari setiap 30 menit sampai selesai - apakah saya perlu membuat tugas cron lain?
Jawaban:
Ketika Drupal menjalankan tugas cron, secara otomatis menangani setiap antrian cron yang ditentukan dari modul, di
drupal_cron_run()
;hook_cron()
implementasi pertama dipanggil, dan kemudian antrian cron dikosongkan.Dalam penerapan
hook_cronapi()
, Anda dapat menambahkan entri untuk fungsi lain yang menangani antrian cron modul Anda.Alternatifnya adalah membiarkan Drupal menangani antrian cron untuk Anda, tetapi itu terjadi ketika tugas-tugas cron Drupal dijalankan. Jika Anda ingin mengosongkan antrian cron modul Anda lebih sering, Anda hanya dapat menambahkan tugas cron baru yang ditangani oleh modul Elysia Cron.
Modul Elysia Cron menangani antrian cron di
elysia_cron_run()
; fungsi ini dipanggil darielysia_cron_cron()
(suatu implementasi darihook_cron()
),drush_elysia_cron_run_wrapper()
(sebuah perintah callback Drush), dan dari cron.php -nya sendiri . Jika Anda mengikuti petunjuk dalam file INSTALL.txt (khususnya dalam "LANGKAH B: MENGUBAH SISTEM CRONTAB (OPTIONAL)"), dan mengganti setiap pemanggilan dari http://example.com/cron.php dengan http: // contoh .com / sites / all / modules / elysia_cron / cron.php , modul Elysia Cron harus sudah menangani antrian cron. Kode yang saya sarankan dapat digunakan untuk mempercepat penanganan antrian cron yang digunakan dari modul Anda, jika perlu secara efektif.sumber
cron.php
? Jika itu masalahnya, itu terjadi setiap menit (lihat komentar pertama saya di @ David's reply).elysia_cron_run
dengan antrian cron diproses secara otomatis setiap kali Elysia's cron.php diminta.Antrian akan diisi melalui kait cronapi Elysia pada waktu yang ditentukan.
Namun, antrian akan diproses setiap kali dijalankan standar cron Drupal.
Lihat potongan pemrosesan panggilan balik pekerja ini di akhir inti: drupal_cron_run
sumber
cron.php
skrip Elysia setiap menit , yang memungkinkan Elysia untuk mengontrol waktu tugas dengan resolusi menit-bijaksana. Tidak ada tugas yang benar-benar berjalan setiap menit - yang membuat saya berpikir saya perlu membuat tugas untuk secara khusus bekerja pada antrian?drupal_cron_run
dipanggil, panggilan balik pekerja antrian cron Anda akan diproses.drupal_cron_run
tidak dipanggil daricron.php
skrip Elysia (saat Elysia diaktifkan);elysia_cron_run
digunakan sebagai gantinya.hook_cron_queue_info
dengan Elysia cron, kecuali jika Anda menetapkan panggilan balik pekerja Anda sendiri, sepertidrupal_cron_run
cuplikan fungsi inti di atas.elysia_cron_run
tidak menelepondrupal_cron_run
, tetapi memang memanggilmodule_invoke_all('cron_queue_info')
dan melakukan beberapa penanganan multi-channel yang membuat asap keluar dari telinga saya.seperti yang dinyatakan di atas ketika menggunakan Elysia Cron antrian Anda tidak diproses.
Anda (dan drupal) tidak memiliki akses ke antrian yang seharusnya berjalan di drupal_run_cron
solusinya adalah membuat tugas cron khusus - (ini akan terlihat oleh elysia cron) untuk memproses semua antrian atau yang Anda inginkan dan menjalankan pemrosesan antrian di sana. yaitu:
sekarang pemrosesan antrian dapat dikontrol oleh ElysiaCron
sumber
Saya tidak menggunakan Elysia, tetapi solusi saya selalu seperti ini:
Ini hanya menangani satu item, untuk setiap cron run. Mungkin Anda ingin mengubahnya.
sumber
Saya juga telah mencoba membungkus kepala saya di sekitar ini, karena saya menggunakan Antrian API untuk pertama kalinya bersama dengan Elysia cron. Setelah pemeriksaan lebih dekat, Anda dapat melihat bahwa Elysia cron mengeksekusi item antrian ketika fungsi elysia_cron_run dipanggil. Lihat cuplikan ini dari baris 1044 dalam file elysia_cron.module :
Ini membantu melegitimasi pemrosesan antrian untuk saya ketika menggunakan Elysia cron.
sumber