Tak to mozliwe...
I szczerze mówiąc, często bardzo ważne jest, aby to zrobić ... WP Scheduler czasami powoduje problemy, gdy zadania CRON są długie ...
Jak więc rozwiązać ten problem?
Używam Transients API do implementacji semaforów ...
Oto kod:
if ( ! wp_next_scheduled( 'my_task_hook' ) ) {
wp_schedule_event( time(), 'hourly', 'my_task_hook' );
}
add_action( 'my_task_hook', 'my_task_function' );
function my_task_function() {
// if some other my_task is already running, stop
if ( get_transient( 'my_task_function_semaphore' ) ) return;
// set semaphore for 5 minutes
set_transient( 'my_task_function_semaphore', true, 5*60 );
// DO YOUR STUFF
delete_transient( 'my_task_function_semaphore' );
}
Dlaczego w tym przypadku używam stanów nieustalonych? Ponieważ:
- Są częścią WP.
- Są łatwe w użyciu i wydajne.
- Nie spowodują impasu. Powiedzmy, że moje zadanie crona może zostać zabite (może wystąpić błąd lub działa zbyt długo i zostaje zabity itd.). W takim przypadku nie usunie semafora, więc wszystkie przyszłe zadania nie będą działać. Korzystanie z transjentów rozwiązuje ten problem, ponieważ po pewnym czasie transjenty zostaną usunięte.
A jeśli będzie wiele różnych działań do zrobienia?
Powiedzmy, że istnieje wiele różnych zadań CRON, które nigdy nie powinny działać w tym samym czasie, ale nadal chcemy, aby wszystkie działały ...
Jeśli użyjemy rozwiązania z semaforem i użyjemy tylko jednego semafora dla wszystkich tych zadań, niektóre z nich mogą nigdy nie zostać uruchomione. Co więc zrobić?
W takim przypadku powinieneś zmienić swoje myślenie. Nie masz żadnych niezależnych zadań, ale kolejkę zadań do wykonania. Dlatego powinieneś wdrożyć to w ten sposób.
Więc:
- Dodajesz kolejkę (możesz użyć tablicy i zapisać ją jako opcję lub dodać niestandardową tabelę DB).
- Używasz obecnie cogodzinnego wydarzenia WP cron, aby dodawać zadania do kolejki.
- Dodajesz drugie zadania WP cron, które są uruchamiane znacznie częściej i „zjadają” zadania z kolejki jeden po drugim. To zadanie „zjadacz” powinno wykorzystywać semafor, aby zapewnić, że w danym momencie działa tylko jedno zadanie.