Ostrzeżenie PHP o nowej instalacji (upłynął limit czasu połączenia)

10

Otrzymuję to Ostrzeżenie PHP podczas uzyskiwania dostępu do mojej nowej instalacji WordPress 3.4.1 (język norweski).

Ostrzeżenie: fopen (URL_TO_MY_WORDPRESS_PAGE / wp-cron.php? Doing_wp_cron = 1341476616.7605190277099609375000): nie można otworzyć strumienia: Przekroczono limit czasu połączenia w pliku PATH_TO_MY_WP_FILES / wp-obejmuje / klasa-http.php na linii 923

Dzieje się tak oczywiście z WP_DEBUGflagą ustawioną na true, ponieważ działa na serwerze programistycznym.

wprowadź opis zdjęcia tutaj

Dzieje się to sporadycznie, więc wydaje się, że jest to problem wp-cron.

Czy to prawdopodobnie błąd w WordPress lub coś nie tak na moim serwerze? Powinienem się martwić?

Serwer jest świeżą maszyną wirtualną z systemem Ubuntu Server 12.04 ze stosem LAMP.

Wyszukiwarka Google pokazuje, że nie tylko ja tego doświadczam. (Zobacz buforowane / indeksowane wersje wymienionych stron, aby zobaczyć rzeczywiste błędy.)

EDYCJA: Dostaję to samo Ostrzeżenie PHP na pierwszej stronie. Czy może to być związane z faktem, że serwer WWW jest NATowany? Obecnie skonfigurowałem zaporę, aby wskazywała port 19235 na 80 na serwerze programistycznym.

ohaal
źródło
Czy w pliku php.ini jest allow_url_fopenwłączone?
its_me
Tak,allow_url_fopen = On
ohaal,

Odpowiedzi:

10

Najwyraźniej odpowiedź brzmi TAK, powinienem się martwić . Po przeprowadzeniu niektórych badań odkryłem, że ostrzeżenie wydaje się być związane z błędnymi konfiguracjami na serwerze, na którym znajduje się WordPress (tj. Problem z moim serwerem, a nie WordPress).

Typowe błędne konfiguracje:

  1. Serwer nie ma DNS, więc nie może dowiedzieć się, kim jest „example.com”, nawet jeśli jest on sam.
  2. Administratorzy serwerów, próbując zabezpieczyć się przed błędami, zablokowali żądania „sprzężenia zwrotnego”, więc nie mogą faktycznie oddzwonić do siebie.
  3. Serwer uruchamia coś o nazwie „mod_security” lub podobną, która aktywnie blokuje połączenie z powodu martwej konfiguracji mózgu.

Problem w moim przypadku był spowodowany przez moją zaporę ogniową (pfSense), która domyślnie ma „Wyłącz odbijanie NAT” (wymieniona jako częsty powód # 2).

Na samym serwerze próbowałem nawiązać połączenie za pomocą usługi telnet, a wynik był następujący:

$ telnet external.server.hostname.com 19235
Próbuję XXX.XXX.XXX.XXX ...
telnet: Nie można połączyć się ze zdalnym hostem: Przekroczono limit czasu połączenia

Aby to naprawić, musiałem odznaczyć opcję Wyłącz odbicie NAT na mojej zaporze ogniowej. W moim przypadku było to w interfejsie internetowym pfSense w System-> Advanced-> Firewall / NAT.
Źródło: http://forum.pfsense.org/index.php?topic=3473.0

wprowadź opis zdjęcia tutaj

Teraz mogę się połączyć ze sobą (na samym serwerze) przez zaporę ogniową:

$ telnet external.server.hostname.com 19235
Próbuję XXX.XXX.XXX.XXX ...
Połączony z external.server.hostname.com.
Znakiem ucieczki jest „^]”.

i nie otrzymuję już ostrzeżenia PHP o wp-cron.


Zrozumiałem to po przeczytaniu tej szczegółowej odpowiedzi dotyczącej wp_cron, wyjaśniając, jak to działa.

Krótka odpowiedź: dodaj to do definicji w pliku wp-config.php: zdefiniuj ('ALTERNATE_WP_CRON', prawda);

Naprawdę długa odpowiedź dla masochistów: Zaplanowane posty nie są teraz i nigdy nie były „zepsute”. Twórcy WordPress nie mogą tego naprawić, ponieważ nie ma nic do naprawienia.

Problem polega na tym, że twój serwer z jakiegoś powodu nie może poprawnie wykonać procesu wp-cron. Ten proces jest mechanizmem czasowym WordPressa, obsługuje on wszystko, od zaplanowanych postów po wysyłanie pingbacków do pingów XMLRPC itp.

Sposób działania jest dość prosty. Za każdym razem, gdy ładuje się strona WordPress, wewnętrznie WordPress sprawdza, czy musi odpalić wp-cron (porównując aktualny czas z ostatnim uruchomieniem wp-cron). Jeśli musi uruchomić wp-cron, wówczas próbuje nawiązać połączenie HTTP z samym sobą, wywołując plik wp-cron.php.

To połączenie z powrotem istnieje z jakiegoś powodu. wp-cron ma wiele do zrobienia, a ta praca wymaga czasu. Opóźnianie przeglądania strony przez użytkownika podczas wykonywania wielu czynności jest złym pomysłem, więc nawiązując połączenie z sobą, może uruchomić program wp-cron w osobnym procesie. Ponieważ sam WordPress nie dba o wynik wp-cron, czeka tylko sekundę, a następnie wraca do renderowania strony internetowej dla użytkownika. Tymczasem wp-cron, po uruchomieniu, działa, dopóki nie zostanie ukończony lub skończy mu się czas wykonywania.

To połączenie HTTP powoduje awarię niektórych źle skonfigurowanych systemów. Zasadniczo WordPress działa jak przeglądarka internetowa. Jeśli Twoja witryna to http://example.com/blog , WP zadzwoni na http://example.com/blog/wp-cron.php, aby rozpocząć proces. Jednak niektóre serwery po prostu nie mogą tego zrobić z jakiegoś powodu. Wśród możliwych przyczyn:

  1. Serwer nie ma DNS, więc nie może dowiedzieć się, kim jest „example.com”, nawet jeśli jest on sam .
  2. Administratorzy serwerów, próbując zabezpieczyć się przed błędami, zablokowali żądania „sprzężenia zwrotnego”, więc nie mogą faktycznie oddzwonić do siebie.
  3. Serwer uruchamia coś o nazwie „mod_security” lub podobną, która aktywnie blokuje połączenie z powodu martwej konfiguracji mózgu.
  4. Coś innego.

Chodzi o to, że z jakiegokolwiek powodu twój serwer WWW jest skonfigurowany w jakiś niestandardowy sposób, który uniemożliwia WordPressowi wykonanie jego pracy. WordPress po prostu nie może tego naprawić.

Jeśli jednak masz ten warunek, istnieje obejście tego problemu. Dodaj to do definicji w pliku wp-config.php:

zdefiniuj („ALTERNATE_WP_CRON”, prawda);

Ta alternatywna metoda wykorzystuje podejście przekierowujące, które powoduje, że przeglądarka użytkownika otrzymuje przekierowanie, gdy cron musi się uruchomić, dzięki czemu natychmiast wracają do witryny, podczas gdy cron nadal działa w połączeniu, które właśnie zrzuciło. Ta metoda jest czasem nieco niepewna, dlatego nie jest domyślna.

Źródło: http://wordpress.org/support/topic/scheduled-posts-still-not-working-in-282#post-1175405

Jak stwierdzono w tym świetnym i szczegółowym poście, jeśli nie masz kontroli nad konfiguracją serwerów lub, w stosownych przypadkach, środowiskiem - obejście

zdefiniuj („ALTERNATE_WP_CRON”, prawda);

w pliku wp-config.php.

ohaal
źródło
3
Bardzo fajny raport!
brasofilo
2
To miłe, gdy ludzie rozwiązują własne problemy, ale niesamowite, kiedy wracają porzucić rozwiązanie. @ohaal Czy wszystko jest w porządku?
its_me
1
@AahanKrish: Jak się okazuje, byłem trochę szybki na palcu spustowym. Problem był nieco bardziej skomplikowany, niż początkowo oczekiwano - sprawcą nie był, jak początkowo przewidywano, błąd apache2. Zaktualizowałem swoją odpowiedź ze szczegółami.
ohaal,