Mam zadanie, które zajmuje około 45 minut i musi być wykonywane codziennie (synchronizacja użytkowników z kilkoma zewnętrznymi bazami danych itp.).
Aby obsłużyć pracę, skonfigurowałem kolejkę cron hook_cron_queue_info()
w następujący sposób:
function mymodule_cron_queue_info() {
$queues = array();
$queues['update_users_queue'] = array(
'worker callback' => '_mymodule_process_user_queue_item',
'time' => 120,
);
return $queues;
}
Wypełniam kolejkę za pomocą tej funkcji:
function mymodule_queue_all_users_for_synching() {
//...query for users...
$queue = DrupalQueue::get('update_users_queue');
foreach($users as $user) {
$queue->createItem($user);
}
}
Funkcja wypełniania kolejek jest wywoływana jako zadanie cron. Używam Elysia Cron , więc moja implementacja hook_cronapi()
to:
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;
}
Funkcja robocza dla każdego zdefiniowanego elementu kolejki mymodule_cron_queue_info
jest następująca:
function _mymodule_process_user_queue_item($item) {
//...synchronize user ($item)...
}
Moje pytanie brzmi: kiedy cron faktycznie zacznie przetwarzać kolejkę?
Powiedzmy, że wypełniam kolejkę codziennie o 3 nad ranem i chcę ją przetworzyć 120 sekund na każde 30 minut, aż się skończy - czy muszę utworzyć kolejne zadanie CRON ?
Odpowiedzi:
Kiedy Drupal uruchamia zadania cron, automatycznie obsługuje każdą kolejkę cron zdefiniowaną z modułów, w
drupal_cron_run()
; pierwszehook_cron()
implementacje są wywoływane, a następnie kolejki cron są opróżniane.Podczas wdrażania
hook_cronapi()
możesz dodać wpis dla innej funkcji obsługującej kolejkę cron Twojego modułu.Alternatywą jest zezwolenie Drupalowi na obsługę kolejki cron, ale dzieje się tak, gdy wykonywane są zadania cron Drupal. Jeśli chcesz częściej opróżniać kolejkę cron swojego modułu, możesz dodać tylko nowe zadanie cron obsługiwane przez moduł Elysia Cron.
Moduł Elysia Cron obsługuje kolejki cron
elysia_cron_run()
; ta funkcja jest wywoływana zelysia_cron_cron()
(implementacjahook_cron()
),drush_elysia_cron_run_wrapper()
(wywołanie zwrotne komendy Drush) oraz z własnego cron.php . Jeżeli postępujesz zgodnie z instrukcjami w INSTALL.txt pliku (w szczególności w „Etap B: Zmiana systemu crontab (opcja)”), i zastąpić dowolny wywołanie http://example.com/cron.php z http: // przykład .com / sites / all / modules / elysia_cron / cron.php , moduł Elysia Cron powinien już obsługiwać kolejki cron. Kod, który zasugerowałem, może zostać wykorzystany do przyspieszenia obsługi kolejek cron używanych z twojego modułu, jeśli istnieje taka potrzeba.źródło
cron.php
? Jeśli tak jest, dzieje się to co minutę (patrz mój pierwszy komentarz do odpowiedzi @ Davida).elysia_cron_run
a kolejki cron są automatycznie przetwarzane za każdym razem, gdy żądane jest cron.php Elysii.Kolejka zostanie zapełniona przez hak Elysia cronapi o ustalonej godzinie.
Jednak kolejka będzie przetwarzana za każdym razem, gdy nastąpi standardowe uruchomienie cron Drupal.
Zobacz ten fragment kodu przetwarzania wywołania zwrotnego pracownika na końcu rdzenia: drupal_cron_run
źródło
cron.php
skrypt Elysia co minutę , co pozwala Elysii kontrolować czasy zadań z dokładnością co do minuty. Żadne zadanie nie jest jednak uruchamiane co minutę - co sprawiło, że pomyślałem, że muszę utworzyć zadanie do pracy z kolejkami?drupal_cron_run
jest wywoływany, wywołanie zwrotne pracownika kolejki cron będzie przetwarzane.drupal_cron_run
nie jest wywoływany zecron.php
skryptu Elysia (gdy Elysia jest włączona);elysia_cron_run
jest używany zamiast tego.hook_cron_queue_info
z cronem Elysia, chyba że określisz własne wywołanie zwrotne pracownika, zgodnie zdrupal_cron_run
powyższym fragmentem funkcji podstawowej .elysia_cron_run
nie zadzwonićdrupal_cron_run
, ale nie rozmowymodule_invoke_all('cron_queue_info')
i nie wymyślnej spodnie obsługi sprawia, że dym wyjdzie moje uszy wielokanałowego.jak wspomniano powyżej podczas korzystania z Elysia Cron, kolejki nie są przetwarzane.
ty (i drupal) nie masz dostępu do kolejek, które w innym przypadku działałyby na drupal_run_cron
obejście polega na utworzeniu niestandardowego zadania cron - (będzie to widoczne dla elysia cron) w celu przetworzenia wszystkich kolejek lub jednego z nich i wywołania tam przetwarzania kolejek. to znaczy:
teraz przetwarzanie kolejek może być kontrolowane przez ElysiaCron
źródło
Nie używam Elysii, ale moje rozwiązanie zawsze było takie:
Obsługuje tylko jeden przedmiot dla każdego przebiegu cron. Może chcesz to zmienić.
źródło
Próbowałem też to obejść, ponieważ po raz pierwszy korzystam z interfejsu API kolejki wraz z cronem Elysia. Po bliższym przyjrzeniu się widać, że cron Elysia wykonuje pozycje w kolejce, gdy wywoływana jest funkcja elysia_cron_run . Zobacz ten fragment kodu z linii 1044 w pliku elysia_cron.module :
Pomogło mi to w odkrywaniu przetwarzania kolejek podczas korzystania z cronu Elysia.
źródło