Mam około 20 wp_cron()
funkcji, takich jak poniższy kod. Prawie wszystkie crony biegają co godzinę; kilka jest codziennie.
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() {
//Complex Code
}
Aby zwiększyć wydajność serwera, aby nie otrzymywać wiadomości o ograniczeniach serwera od firm hostingowych, chcę mieć pewność, że w danym momencie działa tylko jeden cron ... Czy to możliwe?
Obecna zaakceptowana odpowiedź jest świetna, ale mam następujące pytanie, dlatego zaczynam nagrodę za to pytanie.
Najpierw przeczytaj zaakceptowaną odpowiedź.
Załóżmy, że uruchamia się Cron 1, Mój kod cron2 nie działa, ponieważ wciąż jesteśmy w ciągu 5 minut lub pierwszy cron wciąż działa, ale z powodu wp_schedule_event( time(), 'hourly', 'my_task_hook' );
uruchamiania dla cron2 Myślę, że WordPress uważa, że działa cron2 ..... Więc w zasadzie kod kodu cron2 nigdy nie działa ..... Czy coś źle zrozumiałem?
Odpowiedzi:
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:
Dlaczego w tym przypadku używam stanów nieustalonych? Ponieważ:
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:
źródło
delete_transient()
. Więc ten czas ma znaczenie? Mam na myśli to, który czas poświęcaszset_transient
, jest usuwany zaraz po zakończeniu mojej pracy ... Dlaczego więc jest czas?my_task_function_semaphore
jako nazwy przejściowej, muszę używać wszystkich innych cronów pod tą samą nazwą?