Czy powinienem wyłączyć WP_CRON i zamiast tego uruchamiać wp-cron.php z serwera co kilka minut?

12

Wygląda na to, że WordPress niepotrzebnie uruchamia WP CRON przy każdym ładowaniu strony. Myślę, że zamiast uruchamiać go przy każdej wizycie, dlaczego nie zaplanować, aby uruchamiał się co 5 minut przez serwer? Mógłbym po prostu uruchomić wp-cron.php co pięć minut i osiągnąć pożądany wynik?

Czy ma to jakąś wadę?

TheBigK
źródło

Odpowiedzi:

15

Uruchamianie WP CRON przy użyciu zadań cron serwera nie ma żadnej negatywnej strony. W rzeczywistości jest to zalecana praktyka.

Według oficjalnego dokumentu rozwoju wtyczki WordPress :

WP-Cron nie działa w sposób ciągły, co może stanowić problem, jeśli istnieją krytyczne zadania, które muszą zostać uruchomione na czas. Istnieje na to łatwe rozwiązanie. Wystarczy skonfigurować harmonogram zadań w systemie, aby działał w pożądanych odstępach czasu (lub w wymaganym czasie).

Aby to zrobić, musisz najpierw wyłączyć domyślne zachowanie crona w wp-config.php:

define('DISABLE_WP_CRON', true);

Następnie zaplanuj wp-cron.phpz serwera. W przypadku systemu Linux oznacza to:

crontab -e

Jednak zamiast uruchamiać go w wierszu polecenia (CLI), uruchom go jako żądanie HTTP. Do tego możesz użyć wget:

*/5 * * * * wget -q -O - https://your-domain.com/wp-cron.php?doing_wp_cron

WordPress ładuje wszystkie wymagane pliki podstawowe, wtyczki itp. W wp-cron.phpnastępującym KODIE:

if ( !defined('ABSPATH') ) {
    /** Set up WordPress environment */
    require_once( dirname( __FILE__ ) . '/wp-load.php' );
}

Nie martw się więc, że WordPress nie ładuje ważnych funkcji.

Fajaz
źródło
1
Dokumentacja WordPress.org, do której odsyłałeś, wget http://YOUR_SITE_URL/wp-cron.phpnie wspominając o tym ?doing_wp_cron Czy jedna jest lepsza od drugiej? Co robi dodatek ?doing_wp_cron, którego nie robi wersja inna niż?
Garconis,
Prawdopodobnie po to, aby twoje dzienniki wyświetlały ciąg zapytania, abyś wiedział, jak został on wywołany z pewnością.
Slbox
1
Zupełnie się z tym nie zgadzam. Przede wszystkim nie jest prawdą, że jest „zalecane”. Po drugie, ta metoda uszkodzi wszelkie wtyczki korzystające z faktycznie zalecanej metody planowania zdarzeń. Myślę, że to naprawdę zła rada. Prawie nikt nie powinien wyłączać crona, chyba że masz BARDZO konkretny powód, aby to zrobić. Jedynym powodem, dla którego mogę wymyślić, jest to, że łamiesz WordPress na CDN lub coś takiego. To NIE jest normalna praktyka.
John Dee,
1
@JohnDee: ta metoda faktycznie nie wyłącza crona, wyłącza metodę WP Cron, która sprawdza i próbuje uruchamiać zadania cron przy każdym ładowaniu strony. define('DISABLE_WP_CRON', true);wyłącza tylko tę część procesu cron, a następnie wywołuje skrypt cron z kodem typu: */5 * * * * wget -q -O - https://your-domain.com/wp-cron.php?doing_wp_cronna serwerze upewnia się, że zadania cron są wykonywane. Każda wtyczka do planowania nie zna nawet różnicy.
Fayaz
1
Link do dokumentacji WordPress.org na ten temat zmieniono na developer.wordpress.org/plugins/cron/…
aldemarcalazans
2

Istnieje kilka wad: Po pierwsze, gdy używasz wp-cron.php jako biblioteki cli, takie jak zmienne $ _SERVER nie są ustawione. Ludzie pokonują to ograniczenie, używając zamiast tego żądania curl do wp-cron.php.

Po drugie, ponieważ sama WP nie jest ładowana z wp-cron.php; jeśli używasz wtyczki SMTP do programu pocztowego, to nie zostanie ona załadowana podczas wywoływania wp-cron. Ponownie użycie wywołania curl zastępuje ten problem. Zwinięcie wydaje się być najczęściej stosowaną metodą.

Jednak; Wolę używać wp-cli po prawidłowym ustawieniu ustawień poczty w Postfiksie i (dla nginx) konfiguracji php-fpm i ustawieniu pliku crontab, takiego jak

*/5    *   *   *   *  wp cron event list --skip-plugins --skip-themes --path="/var/www/vhosts/example.com/httpdocs/wp" --fields=hook,next_run_relative --format=csv | awk -F, '$2=="now" {print $1}' | xargs -r wp --path="/var/www/vhosts/example.com/httpdocs/wp" cron event run $1

(Wyświetl listę wszystkich cronów z określonymi polami w formacie csv - hook jest nazwą crona, względny czas następnego uruchomienia. Usuń te, które pokazują „teraz” jako następne uruchomienie (te, które są teraz) za pomocą AWK, przekaż tę listę do xargs do wywoływanie wp cron event run $HOOKkażdego crona.) Korzystanie z wp-cli ładuje WordPressa poprawnie (wybieram pominięcie wtyczek podczas wyświetlania listy cronów, ponieważ błędy kodu i ostrzeżenia php zepsują skrypty, ale nie pomijanie ich podczas uruchamiania crona z xargs, ponieważ cron może wymagać załadowania wtyczek)

Mam nadzieję, że daje to kilka wskazówek, na co zwrócić uwagę.

TechnicalChaos
źródło
2
Co powiesz na konfigurację: / 15 * * * wget -q -O - twojadomena.com/wp-cron.php?doing_wp_cron, jak sugeruje TomMcFarlin - tommcfarlin.com/wordpress-cron-jobs . Wydaje się, że dobrze wykonuje swoją pracę. Byłbym wdzięczny za twój komentarz.
TheBigK
Tak, jak już wspomniałem, ludzie wybierają curl (wget lub inne wywołanie http) do wyzwalania cronów, a przy tej metodzie nie ma nic złego. Właśnie doradzałem problemy z bezpośrednim wywołaniem pliku php wp-cron, który nie zawierałby wymaganych plików, i doradzałem inną alternatywną metodę, jeśli chcesz trochę urozmaicić.
TechnicalChaos,
0

Istnieje wiele powodów, aby nie wyłączać wp-cron. W rzeczywistości znalezienie takiego przypadku jest prawie niemożliwe. Nie spowalnia Twojej witryny i jest używany do rzeczy, o których możesz nie wiedzieć.

Wiele wtyczek używa WP-Crona do planowania rzeczy. Mogą się zdezorientować, jeśli wyłączysz program planujący.

Liczba samouczków na ten temat jest bardzo rozpowszechniona, ponieważ jest myląca i ponieważ nie ma wiele wspólnego z witryną po jej wyłączeniu. To, co zrobi, spowoduje ból głowy dla twórcy, który musi rozwiązać tajemniczy problem, który stwarza w ciągu sześciu miesięcy.

Ponadto, Heartbeat WP strzela co 15 sekund w obszarze administracyjnym, rozwiązując ten problem dla 99% ludzi, którzy myślą, że go mają.

John Dee
źródło
2
To okropna odpowiedź - NIE-wyłączają WP Crona. Wyłączają jedynie wywoływanie WP Cron przy ładowaniu strony i zamiast tego odciążają go do systemowego demona cron. Do licha.
Barry Chapman
W każdym razie głównym powodem pozostawienia go w spokoju jest to, że wiele wtyczek używa teraz crona do wykonywania rozszerzonego zadania w tle. Możesz zepsuć coś, co robi NASTĘPNA osoba, ponieważ oczekuje ona, że ​​system będzie działał w standardowy sposób. Powodzenia!
John Dee
jeśli wtyczka jest kodowana w sposób, który całkowicie się psuje, jeśli wp cron jest wyłączony, oznacza to, że został zaprogramowany przez niekompetentnego i lepiej natychmiast go odinstalować.
Magnetic_dud
Cóż, dwa komentarze tutaj potwierdzają mój punkt widzenia. Jeden z deweloperów mówi: „to nie wyłącza crona, jedynie tasuje go do crona systemu operacyjnego” - co jest przerwą w WordPress, który jest neutralny dla systemu operacyjnego. Następnie inny programista mówi: „hej, to deweloper wtyczki jest odpowiedzialny za zaplanowanie anihilacji wp cron”. Okej Więc jeśli chcesz funkcjonalność crona, powinieneś PLANOWAĆ eliminację systemu cron? Do czego? Zapasowy system CRON? Ten komentarz nie ma sensu [oczywiście].
John Dee
W każdym razie, obecny stan to „CAŁKOWITA KONFUZJA”. To jest obecny stan. Jedynym rozwiązaniem, pochodzącym z ramowego POV, jest powiedzenie ludziom: ISTNIEJE POWÓD, KTÓRY ISTNIEJE SYSTEM WP-CRON. NIE WYŁĄCZAJ. Druga opcja to 10 000 różnych, różnych opinii. Właśnie to mamy teraz.
John Dee
0

Mam jeszcze znaleźć prawdziwą wadę odciążania wp-cron do usługi zewnętrznej. Robię to od wielu lat.

Zwłaszcza w dzisiejszym świecie, w którym można uruchamiać aplikacje jako mikrousługi.

Używam osobnych kontenerów Docker dla każdego komponentu WordPress - php, web, db, crontab, redis i tak dalej. Posiadanie crontab jako osobnego kontenera, wywoływanie wp-cron przez http za pomocą sieci lokalnej, działające tylko wtedy, gdy jest to potrzebne.

Zmniejsza to obciążenie węzłów zaplecza i poprawia bezpieczeństwo dzięki mniejszej powierzchni ataku.

Jeśli deweloper nie może wymyślić, jak to zrobić, bez konieczności wywoływania wp-cron przy każdym ładowaniu strony, do diabła, to po prostu mówi o braku doświadczenia w jego imieniu. „Pozostawienie w spokoju”, ponieważ nie rozumiesz, jak działają rzeczy, nie jest dobrym powodem, aby je zachować.

Radoslav Stefanov
źródło