WP-Cron - jak działa i jak zastąpić go prawdziwym cronem

Dlaczego zaplanowane wpisy się spóźniają, a maile ze sklepu wychodzą falami. Jak działa WP-Cron i jak w 15 minut zastąpić go cronem systemowym w DirectAdmin.

WP-Cron to wewnętrzny harmonogram WordPressa: publikuje zaplanowane wpisy, wysyła maile ze sklepu, robi kopie z wtyczek, czyści kosz. Problem w tym, że wcale nie jest cronem - nie odmierza czasu. Uruchamia się tylko wtedy, gdy ktoś wejdzie na stronę. Ta jedna konstrukcyjna decyzja odpowiada za dwa pozornie przeciwne problemy: na stronach z małym ruchem zadania się spóźniają, a na stronach z dużym ruchem WP-Cron dokłada się do każdego żądania i spowalnia serwis.

W tym poradniku tłumaczymy, jak ten mechanizm działa naprawdę, po czym poznać, że sprawia kłopoty, i jak w kwadrans zastąpić go prawdziwym cronem systemowym - z gotową konfiguracją dla panelu DirectAdmin.

Jak naprawdę działa WP-Cron

Przy każdej odsłonie strony WordPress sprawdza listę zaplanowanych zadań. Jeśli któremuś minął termin, dokleja do bieżącego żądania dodatkowe wywołanie pliku wp-cron.php, które te zadania wykonuje. Kluczowe konsekwencje:

  • Bez odwiedzin nic się nie dzieje. Zadanie zaplanowane na 3:00 w nocy wykona się dopiero wtedy, gdy rano wejdzie pierwszy gość. Na stronie odwiedzanej raz na kilka dni „codzienny" backup bywa robiony co kilka dni.
  • Zadania jeżdżą na plecach odwiedzających. Pechowy gość, który trafi na moment startu ciężkiego zadania (np. generowanie raportu przez wtyczkę), czeka na odpowiedź dłużej niż inni.
  • Przy dużym ruchu mechanizm sprawdza listę zadań setki razy na minutę. Samo sprawdzanie jest tanie, ale blokada przed równoległym wykonaniem opiera się o wpis w bazie - i przy naprawdę dużym ruchu potrafi się ścigać.

To rozwiązanie genialne w swojej przenośności (działa na każdym hostingu bez konfiguracji) i słabe wydajnościowo. Dlatego standardem na poważnych stronach jest wyłączenie trybu wbudowanego i wywoływanie wp-cron.php z zewnątrz, o stałych porach.

Po czym poznać, że WP-Cron sprawia problemy

ObjawMechanizm
zaplanowane wpisy pokazują „Missed schedule" / „pominięto zaplanowanie"nikt nie wszedł na stronę o czasie publikacji
maile ze sklepu wychodzą z opóźnieniem, falamikolejka czeka na odsłonę, potem wykonuje się hurtem
losowe pojedyncze odsłony trwają kilka sekund, reszta jest szybkapechowy gość „wylosował" wykonanie ciężkiego zadania
wtyczka backupu kończy pracę w środku dnia zamiast w nocystart zadania czekał na poranny ruch
na wykresach obciążenia piły dokładnie co godzinę w godzinach ruchuskumulowane zadania interwałowe

Listę zaplanowanych zadań podejrzysz wtyczką WP Crontrol (kokpit - Narzędzia - Cron Events) albo poleceniem wp cron event list przez SSH - więcej takich poleceń zebraliśmy w praktycznym przewodniku po WP-CLI. Już sam podgląd bywa pouczający: instalacje z długą historią potrafią mieć wpisy po dawno usuniętych wtyczkach, wykonywane co godzinę w pustkę.

Krok 1: wyłącz tryb wbudowany

W pliku wp-config.php, powyżej linii „That's all, stop editing!", dodaj:

define('DISABLE_WP_CRON', true);

Ta stała nie wyłącza harmonogramu - wyłącza tylko doklejanie wykonania do odsłon. Zadania dalej czekają w kolejce; od teraz wykona je wyłącznie bezpośrednie wywołanie pliku wp-cron.php. Dlatego ten krok bez kroku drugiego oznacza stronę, na której przestają działać wszystkie automaty - nie przerywaj konfiguracji w połowie.

Krok 2: prawdziwy cron w DirectAdmin

W panelu DirectAdmin wejdź w sekcję zadań cron (Advanced Features - Cron Jobs). Dodaj nowe zadanie:

Interwał: co 5 minut (w polach minut wpisz */5, pozostałe pola gwiazdki).

Polecenie - najpewniejszy wariant przez WP-CLI:

cd /home/UZYTKOWNIK/domains/TWOJADOMENA.pl/public_html && wp cron event run --due-now >/dev/null 2>&1

Wariant alternatywny przez HTTP (gdy wolisz nie zależeć od WP-CLI):

curl -s https://twojadomena.pl/wp-cron.php?doing_wp_cron >/dev/null 2>&1

Różnica praktyczna: wariant WP-CLI działa nawet wtedy, gdy strona jest schowana za hasłem albo blokadą IP, i nie przechodzi przez cache. Wariant curl jest prostszy, ale musi mieć drożną drogę po HTTP. Końcówka >/dev/null 2>&1 wycisza wyjście - bez niej panel będzie słał mail po każdym wykonaniu, czyli 288 wiadomości dziennie.

Nawigację po panelu, łącznie z sekcją cron, znajdziesz w przewodniku po DirectAdmin.

Jaki interwał wybrać

Co 5 minut to rozsądny standard - wystarcza dla sklepów (maile, statusy zamówień), publikacji planowanych i typowych wtyczek. Częściej niż co minutę nie schodź: WordPress i tak grupuje zadania, a zbyt częste wywołania to puste obroty.

Wyjątki w obie strony: mała wizytówka bez sklepu spokojnie zniesie interwał co 15-30 minut; z kolei sklep z bramką płatności czekającą na potwierdzenia webhookiem nie potrzebuje częstszego crona z tego powodu - webhooki przychodzą własną drogą, niezależną od WP-Cron.

Krok 3: sprawdź, że działa

Po kwadransie od ustawienia:

  • w WP Crontrol spójrz na kolumnę „Next Run" - zadania po terminie powinny zniknąć, a czasy następnych wykonań być w przyszłości;
  • przez SSH: wp cron event list nie powinno pokazywać pozycji z czasem w przeszłości;
  • test bojowy: zaplanuj publikację testowego wpisu za 10 minut i nie wchodź na stronę. Wpis ma się opublikować sam.

Pułapki, które widujemy najczęściej

DISABLE_WP_CRON bez skonfigurowanego crona. Klasyka: ktoś wkleił stałą „bo tak radzą w poradniku o szybkości", cron systemowy nigdy nie powstał, a po dwóch tygodniach sklep „przestał wysyłać maile". Jeśli przejmujesz stronę po kimś, sprawdź obie strony układanki naraz.

Cache przed wp-cron.php. Przy wariancie curl upewnij się, że adres wp-cron.php nie jest serwowany z cache (LiteSpeed Cache domyślnie go omija, ale reguły własne potrafią to zepsuć). Odpowiedź z cache = zadania nie ruszają, choć cron „działa".

Ciężkie zadania wtyczek o pełnych godzinach. Prawdziwy cron wykonuje zadania punktualnie - także wtedy, gdy pięć wtyczek zaplanowało swoje ciężkie prace równo na pełną godzinę. Gdy widzisz piłę obciążenia co 60 minut, rozstrzel harmonogramy (WP Crontrol pozwala zmienić czas zdarzenia) albo przenieś backupy na porę nocną. Ma to znaczenie zwłaszcza w kontekście limitów kont na hostingu współdzielonym.

Osierocone zadania po usuniętych wtyczkach. Wpisy w harmonogramie zostają po odinstalowaniu wtyczki i co interwał próbują wywołać nieistniejący kod. WP Crontrol pokazuje je jako zadania bez akcji - usuń je ręcznie.

Strefa czasowa. Cron systemowy chodzi według czasu serwera, harmonogram WordPressa według strefy ustawionej w kokpicie. Przy interwale co 5 minut to bez znaczenia, ale gdy ustawiasz zadanie „raz dziennie o 3:00" bezpośrednio w cronie, upewnij się, o czyją godzinę trzecią chodzi.

Podsumowanie

WP-Cron w trybie wbudowanym to kompromis: działa wszędzie, ale czas wykonania zadań uzależnia od ruchu i dokłada pracę do odsłon. Zamiana na cron systemowy to 15 minut: jedna stała w wp-config.php, jedno zadanie co 5 minut w DirectAdmin, krótka weryfikacja. Od tej chwili publikacje wychodzą punktualnie, maile ze sklepu nie czekają na gościa, a odwiedzający nigdy nie płacą czasem ładowania za backup wtyczki.

Na naszym hostingu cron jest dostępny w każdym pakiecie, a jeśli wolisz, żebyśmy skonfigurowali to za Ciebie - napisz, ustawimy przy okazji darmowej migracji.

Powiązane poradniki

Wszystkie poradniki z kategorii: Szybkość i wydajność

Powiązane usługi McProdukt

  • Hosting WWW NVMe - szybki hosting z LiteSpeed, darmowym SSL i codziennym backupem

Zobacz również