Advertencia de PHP en una instalación nueva (se agotó el tiempo de conexión)

10

Recibo esta advertencia de PHP cuando accedo a mi nueva instalación de WordPress 3.4.1 (idioma noruego).

Advertencia: fopen (URL_TO_MY_WORDPRESS_PAGE / wp-cron.php? Doing_wp_cron = 1341476616.7605190277099609375000): no se pudo abrir la transmisión: La conexión expiró en PATH_TO_MY_WP_FILES / wp-includes / class-http.php en la línea 923

Esto es, por supuesto, con el WP_DEBUGindicador establecido en true, ya que se ejecuta en un servidor de desarrollo.

ingrese la descripción de la imagen aquí

Esto sucede de manera intermitente, por lo que parece ser un problema wp-cron.

¿Es probable que esto sea un error en WordPress o algo mal en mi servidor? ¿Debería preocuparme?

El servidor es un nuevo Ubuntu Server 12.04 VM con la pila LAMP.

La búsqueda en Google muestra que no soy el único que experimenta esto. (Consulte las versiones almacenadas / indexadas de las páginas enumeradas para ver los errores reales).

EDITAR: También estoy recibiendo esta misma advertencia de PHP en la portada. ¿Podría estar relacionado con el hecho de que el servidor web está siendo conectado a NAT? Actualmente he configurado el firewall para apuntar el puerto 19235 al 80 en el servidor de desarrollo.

ohaal
fuente
En su archivo php.ini, ¿está allow_url_fopenconfigurado en ON?
its_me
Sí,allow_url_fopen = On
ohaal

Respuestas:

10

La respuesta es aparentemente SÍ, debería preocuparme . Después de algunas investigaciones, descubrí que la advertencia parece estar relacionada con configuraciones incorrectas en el servidor en el que está alojado WordPress (es decir, un problema con mi servidor, no con WordPress).

Configuraciones erróneas comunes:

  1. El servidor no tiene DNS, por lo que no puede descubrir quién es "example.com", aunque sea él mismo.
  2. Los administradores del servidor, en un intento equivocado de seguridad, han bloqueado las solicitudes de "bucle invertido", por lo que en realidad no pueden volver a llamar.
  3. El servidor está ejecutando algo llamado "mod_security" o similar, que bloquea activamente la llamada debido a la configuración de muerte cerebral.

El problema en mi caso fue en realidad causado por mi firewall (pfSense), que tiene "Desactivar la reflexión NAT" de forma predeterminada (aparece como razón común # 2).

En el servidor en sí, intenté comunicarme con telnet, y el resultado fue el siguiente:

$ telnet external.server.hostname.com 19235
Intentando XXX.XXX.XXX.XXX ...
telnet: no se puede conectar al host remoto: se agotó el tiempo de espera de la conexión

Para solucionar esto, tuve que desmarcar Desactivar la reflexión NAT en mi firewall. En mi caso, esto estaba en la interfaz web de pfSense en Sistema-> Avanzado-> Firewall / NAT.
Fuente: http://forum.pfsense.org/index.php?topic=3473.0

ingrese la descripción de la imagen aquí

Ahora puedo conectarme a mí mismo (en el servidor) a través del cortafuegos:

$ telnet external.server.hostname.com 19235
Intentando XXX.XXX.XXX.XXX ...
Conectado a external.server.hostname.com.
El carácter de escape es '^]'.

y ya no recibo la advertencia de PHP sobre wp-cron.


Me di cuenta de esto después de leer esta respuesta detallada sobre wp_cron, explicando cómo funciona.

Respuesta corta: agregue esto a las definiciones en su archivo wp-config.php: define ('ALTERNATE_WP_CRON', verdadero);

Respuesta realmente larga, para masoquistas: las publicaciones programadas no están ahora, y nunca han sido, "rotas". Los desarrolladores de WordPress no pueden arreglarlo porque no hay nada que arreglar.

El problema radica en el hecho de que su servidor, por alguna razón, no puede ejecutar correctamente el proceso wp-cron. Este proceso es el mecanismo de sincronización de WordPress, maneja todo, desde publicaciones programadas hasta el envío de pingbacks a pings XMLRPC, etc.

La forma en que funciona es bastante simple. Cada vez que se carga una página de WordPress, internamente WordPress comprueba si necesita activar wp-cron (comparando la hora actual con la última vez que se ejecutó wp-cron). Si necesita ejecutar wp-cron, entonces intenta hacer una conexión HTTP de vuelta a sí mismo, llamando al archivo wp-cron.php.

Esta conexión a sí misma está ahí por una razón. wp-cron tiene mucho trabajo por hacer, y ese trabajo lleva tiempo. Retrasar que el usuario vea su página web mientras hace un montón de cosas es una mala idea, por lo que al hacer esa conexión de vuelta a sí mismo, puede ejecutar el programa wp-cron en un proceso separado. Dado que WordPress en sí no se preocupa por el resultado del wp-cron, solo espera un segundo, luego vuelve a mostrar la página web para el usuario. Mientras tanto, wp-cron, que se ha lanzado, hace su trabajo hasta que finaliza o se queda sin tiempo de ejecución.

Esa conexión HTTP es donde fallan algunos sistemas mal configurados. Básicamente, WordPress está actuando como un navegador web. Si su sitio era http://example.com/blog , entonces WP llamará a http://example.com/blog/wp-cron.php para comenzar el proceso. Sin embargo, algunos servidores simplemente no pueden hacer eso por alguna razón. Entre las posibles razones:

  1. El servidor no tiene DNS, por lo que no puede descubrir quién es "example.com", aunque sea él mismo .
  2. Los administradores del servidor, en un intento equivocado de seguridad, han bloqueado las solicitudes de "bucle invertido", por lo que en realidad no pueden volver a llamar.
  3. El servidor está ejecutando algo llamado "mod_security" o similar, que bloquea activamente la llamada debido a la configuración de muerte cerebral.
  4. Algo más.

El punto es que, por cualquier razón, su servidor web está configurado de una manera no estándar que impide que WordPress haga su trabajo. WordPress simplemente no puede arreglar eso.

Sin embargo, si tiene esta condición, hay una solución alternativa. Agregue esto a to define en su archivo wp-config.php:

define ('ALTERNATE_WP_CRON', verdadero);

Este método alternativo utiliza un enfoque de redirección, que hace que el navegador de los usuarios obtenga una redirección cuando el cron necesita ejecutarse, de modo que regresen al sitio inmediatamente mientras cron continúa ejecutándose en la conexión que acaban de desconectar. Este método es un poco dudoso a veces, por lo que no es el predeterminado.

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

Como se indica en esta excelente y detallada publicación, si no tiene control sobre la configuración de sus servidores o, si corresponde, el entorno, se debe poner una solución alternativa

define ('ALTERNATE_WP_CRON', verdadero);

en su archivo wp-config.php.

ohaal
fuente
3
Muy buen informe!
brasofilo
2
Es agradable cuando las personas resuelven sus propios problemas, pero increíble cuando vuelven a dejar caer la solución. @ohaal Entonces, ¿está todo bien ahora?
its_me
1
@AahanKrish: Resulta que fui un poco rápido en el dedo del gatillo. El problema fue un poco más complicado de lo esperado: el culpable no fue, como se había previsto inicialmente, el error apache2. He actualizado mi respuesta con los detalles.
ohaal