PHP-Warnung bei Neuinstallation (Zeitüberschreitung der Verbindung)

10

Ich erhalte diese PHP-Warnung, wenn ich auf meine neue WordPress 3.4.1-Installation (norwegische Sprache) zugreife.

Warnung: fopen (URL_TO_MY_WORDPRESS_PAGE / wp-cron.php? Doing_wp_cron = 1341476616.7605190277099609375000): Stream konnte nicht geöffnet werden: Zeitüberschreitung der Verbindung in PATH_TO_MY_WP_FILES / wp-include / class-http.php in Zeile 9

Dies ist natürlich mit dem WP_DEBUGFlag gesetzt true, da es auf einem Entwicklungsserver ausgeführt wird.

Geben Sie hier die Bildbeschreibung ein

Dies geschieht zeitweise, so dass es ein Problem mit zu sein scheint wp-cron.

Ist dies wahrscheinlich ein Fehler in WordPress oder ein Fehler auf meinem Server? Sollte ich mir Sorgen machen?

Der Server ist eine neue Ubuntu Server 12.04-VM mit dem LAMP-Stack.

Die Google-Suche zeigt, dass ich nicht der einzige bin, der dies erlebt. (Informationen zu den tatsächlichen Fehlern finden Sie in den gepufferten / indizierten Versionen der aufgelisteten Seiten.)

EDIT: Ich bekomme auch die gleiche PHP-Warnung auf der Titelseite. Könnte es damit zusammenhängen, dass der Webserver NAT-fähig ist? Derzeit habe ich die Firewall so eingerichtet, dass Port 19235 bis 80 auf dem Entwicklungsserver angezeigt werden.

ohaal
quelle
Ist in Ihrer php.ini-Datei allow_url_fopenON eingestellt?
its_me
Ja,allow_url_fopen = On
ohaal

Antworten:

10

Die Antwort ist anscheinend JA, ich sollte mir Sorgen machen . Nach einigen Recherchen habe ich festgestellt, dass die Warnung mit Fehlkonfigurationen auf dem Server zusammenhängt, auf dem WordPress gehostet wird (dh einem Problem mit meinem Server, nicht mit WordPress).

Häufige Fehlkonfigurationen:

  1. Der Server verfügt nicht über DNS und kann daher nicht herausfinden, wer "example.com" ist, obwohl es sich selbst handelt.
  2. Serveradministratoren haben in einem fehlgeleiteten Sicherheitsversuch "Loopback" -Anforderungen blockiert, sodass sie sich selbst nicht zurückrufen können.
  3. Auf dem Server wird "mod_security" oder ähnliches ausgeführt, wodurch der Anruf aufgrund einer hirntoten Konfiguration aktiv blockiert wird.

Das Problem in meinem Fall wurde tatsächlich durch meine Firewall (pfSense) verursacht, die standardmäßig die Option "NAT-Reflektion deaktivieren" hat (als allgemeiner Grund Nr. 2 aufgeführt).

Auf dem Server selbst habe ich versucht, mich über Telnet zu erreichen. Das Ergebnis war wie folgt:

$ telnet external.server.hostname.com 19235
Versuch XXX.XXX.XXX.XXX ...
Telnet: Verbindung zum Remote-Host kann nicht hergestellt werden: Zeitüberschreitung der Verbindung

Um dies zu beheben, musste ich die Option NAT-Reflektion auf meiner Firewall deaktivieren deaktivieren . In meinem Fall war dies in der Weboberfläche von pfSense unter System-> Erweitert-> Firewall / NAT.
Quelle: http://forum.pfsense.org/index.php?topic=3473.0

Geben Sie hier die Bildbeschreibung ein

Jetzt kann ich über die Firewall eine Verbindung zu mir selbst (auf dem Server selbst) herstellen:

$ telnet external.server.hostname.com 19235
Versuch XXX.XXX.XXX.XXX ...
Verbunden mit external.server.hostname.com.
Escape-Zeichen ist '^]'.

und ich bekomme keine PHP-Warnung mehr über wp-cron.


Ich habe das herausgefunden, nachdem ich diese ausführliche Antwort gelesen und erklärt hatte, wie es funktioniert.wp_cron

Kurze Antwort: Fügen Sie dies zu den Definitionen in Ihrer Datei wp-config.php hinzu: define ('ALTERNATE_WP_CRON', true);

Wirklich lange Antwort für Masochisten: Geplante Posts sind nicht jetzt und waren noch nie "kaputt". Die Entwickler von WordPress können das Problem nicht beheben, da nichts zu beheben ist.

Das Problem liegt in der Tatsache, dass Ihr Server aus irgendeinem Grund den wp-cron-Prozess nicht ordnungsgemäß ausführen kann. Dieser Prozess ist der Timing-Mechanismus von WordPress. Er behandelt alles von geplanten Posts bis zum Senden von Pingbacks an XMLRPC-Pings usw.

Die Art und Weise, wie es funktioniert, ist ziemlich einfach. Wenn eine WordPress-Seite geladen wird, prüft WordPress intern, ob wp-cron ausgelöst werden muss (indem die aktuelle Zeit mit der letzten Ausführung von wp-cron verglichen wird). Wenn wp-cron ausgeführt werden muss, wird versucht, eine HTTP-Verbindung zu sich selbst herzustellen, indem die Datei wp-cron.php aufgerufen wird.

Diese Verbindung zu sich selbst gibt es aus einem Grund. wp-cron hat viel zu tun, und diese Arbeit braucht Zeit. Es ist eine schlechte Idee, dem Benutzer das Anzeigen seiner Webseite zu verzögern, während er eine Reihe von Aufgaben ausführt. Wenn Sie also diese Verbindung wieder herstellen, kann das Programm wp-cron in einem separaten Prozess ausgeführt werden. Da sich WordPress selbst nicht um das Ergebnis des wp-cron kümmert, wartet es nur eine Sekunde und kehrt dann zum Rendern der Webseite für den Benutzer zurück. In der Zwischenzeit erledigt wp-cron nach dem Start seine Arbeit, bis es fertig ist oder die Ausführungszeit abgelaufen ist.

Bei dieser HTTP-Verbindung fallen einige schlecht konfigurierte Systeme aus. Grundsätzlich verhält sich WordPress wie ein Webbrowser. Wenn Ihre Site http://example.com/blog war , ruft WP http://example.com/blog/wp-cron.php auf, um den Vorgang zu starten. Einige Server können dies jedoch aus irgendeinem Grund einfach nicht. Unter den möglichen Gründen:

  1. Der Server verfügt nicht über DNS und kann daher nicht herausfinden, wer "example.com" ist, obwohl es sich selbst handelt .
  2. Serveradministratoren haben in einem fehlgeleiteten Sicherheitsversuch "Loopback" -Anforderungen blockiert, sodass sie sich selbst nicht zurückrufen können.
  3. Auf dem Server wird "mod_security" oder ähnliches ausgeführt, wodurch der Anruf aufgrund einer hirntoten Konfiguration aktiv blockiert wird.
  4. Etwas anderes.

Der Punkt ist, dass Ihr Webserver aus irgendeinem Grund auf eine nicht standardmäßige Weise konfiguriert ist, die verhindert, dass WordPress seine Arbeit erledigt. WordPress kann das einfach nicht beheben.

Wenn Sie diese Bedingung haben, gibt es jedoch eine Problemumgehung. Fügen Sie dies zu den Definitionen in Ihrer Datei wp-config.php hinzu:

define ('ALTERNATE_WP_CRON', true);

Diese alternative Methode verwendet einen Umleitungsansatz, bei dem der Browser des Benutzers eine Umleitung erhält, wenn der Cron ausgeführt werden muss, sodass er sofort zur Site zurückkehrt, während der Cron in der gerade unterbrochenen Verbindung weiter ausgeführt wird. Diese Methode ist manchmal etwas zweifelhaft, weshalb sie nicht die Standardeinstellung ist.

Quelle: http://wordpress.org/support/topic/scheduled-posts-still-not-working-in-282#post-1175405

Wie in diesem großartigen und detaillierten Beitrag erwähnt, ist es eine Problemumgehung, wenn Sie keine Kontrolle über die Konfiguration Ihres Servers oder gegebenenfalls über die Umgebung haben

define ('ALTERNATE_WP_CRON', true);

in Ihrer wp-config.php Datei.

ohaal
quelle
3
Sehr schöner Bericht!
Brasofilo
2
Es ist schön, wenn Leute ihre eigenen Probleme lösen, aber großartig, wenn sie zurückkommen, um die Lösung fallen zu lassen. @ohaal Also, ist jetzt alles in Ordnung?
its_me
1
@AahanKrish: Wie sich herausstellte, war ich ein bisschen schnell am Abzugsfinger. Das Problem war etwas komplizierter als zunächst erwartet - der Schuldige war nicht wie ursprünglich erwartet der Apache2-Fehler. Ich habe meine Antwort mit den Details aktualisiert.
Ohaal