Aviso do PHP na instalação nova (tempo limite da conexão esgotado)

10

Recebo esse aviso do PHP ao acessar minha nova instalação do WordPress 3.4.1 (idioma norueguês).

Aviso: fopen (URL_TO_MY_WORDPRESS_PAGE / wp-cron.php? Doing_wp_cron = 1341476616.7605190277099609375000): falha ao abrir o fluxo: a conexão expirou em PATH_TO_MY_WP_FILES / wp-includes / class-http.php na linha 923

É claro que isso está com o WP_DEBUGsinalizador definido truecomo, pois está sendo executado em um servidor de desenvolvimento.

insira a descrição da imagem aqui

Isso acontece de forma intermitente, por isso parece ser um problema wp-cron.

Isso provavelmente é um erro no WordPress ou algo errado no meu servidor? Eu deveria me preocupar?

O servidor é uma VM nova do Ubuntu Server 12.04 com a pilha LAMP.

A pesquisa do Google mostra que não sou o único a experimentar isso. (Consulte as versões em buffer / indexadas das páginas listadas para ver os erros reais.)

Edição: Eu também estou recebendo este mesmo aviso PHP na primeira página. Isso poderia estar relacionado ao fato de o servidor da web estar sendo NAT? Atualmente, configurei o firewall para apontar a porta 19235 a 80 no servidor de desenvolvimento.

ohaal
fonte
No seu arquivo php.ini, está allow_url_fopendefinido como ON?
its_me
Sim,allow_url_fopen = On
ohaal 5/07

Respostas:

10

A resposta é aparentemente SIM, eu deveria me preocupar . Após algumas pesquisas, descobri que o aviso parece estar relacionado a configurações incorretas no servidor em que o WordPress está hospedado (ou seja, um problema no meu servidor, não no WordPress).

Configurações incorretas comuns:

  1. O servidor não possui DNS e, portanto, não consegue descobrir quem é "example.com", mesmo que seja ele próprio.
  2. Os administradores de servidor, em uma tentativa equivocada de segurança, bloquearam solicitações de "loopback", de modo que não é possível fazer uma chamada de volta para si mesma.
  3. O servidor está executando algo chamado "mod_security" ou similar, que bloqueia ativamente a chamada devido à configuração com morte cerebral.

O problema no meu caso foi realmente causado pelo meu firewall (pfSense), que tem "Desativar reflexão do NAT" por padrão (listado como motivo comum nº 2).

No próprio servidor, tentei me acessar usando telnet, e o resultado foi o seguinte:

$ telnet external.server.hostname.com 19235
Tentando XXX.XXX.XXX.XXX ...
telnet: Não foi possível conectar ao host remoto: a conexão expirou

Para corrigir isso, tive que desmarcar a opção Desativar reflexão NAT no meu firewall. No meu caso, isso estava na interface da web do pfSense em Sistema-> Avançado-> Firewall / NAT.
Fonte: http://forum.pfsense.org/index.php?topic=3473.0

insira a descrição da imagem aqui

Agora eu posso me conectar (no próprio servidor) através do firewall:

$ telnet external.server.hostname.com 19235
Tentando XXX.XXX.XXX.XXX ...
Conectado ao external.server.hostname.com.
O caractere de escape é '^]'.

e não estou mais recebendo o aviso do PHP sobre o wp-cron.


Eu descobri isso depois de ler esta resposta detalhada sobre wp_cron, explicando como funciona.

Resposta curta: adicione isso ao define no seu arquivo wp-config.php: define ('ALTERNATE_WP_CRON', true);

Resposta realmente longa, para masoquistas: as postagens agendadas não são agora e nunca foram "quebradas". Os desenvolvedores do WordPress não podem consertá-lo porque não há nada para consertar.

O problema está no fato de que seu servidor, por algum motivo, não pode executar corretamente o processo wp-cron. Esse processo é o mecanismo de sincronização do WordPress, ele lida com tudo, desde postagens agendadas até o envio de pingbacks a pings XMLRPC, etc.

O modo como funciona é bem simples. Sempre que uma página do WordPress é carregada, o WordPress verifica internamente se é necessário acionar o wp-cron (comparando a hora atual com a última vez que a wp-cron foi executada). Se ele precisar executar o wp-cron, ele tentará estabelecer uma conexão HTTP novamente, chamando o arquivo wp-cron.php.

Essa conexão de volta para si existe por um motivo. O wp-cron tem muito trabalho a fazer, e esse trabalho leva tempo. Adiar o usuário a ver sua página da Web enquanto faz várias coisas é uma má idéia; portanto, ao fazer essa conexão voltar a si, ele pode executar o programa wp-cron em um processo separado. Como o WordPress em si não se importa com o resultado do wp-cron, ele espera apenas um segundo e volta a renderizar a página da web para o usuário. Enquanto isso, o wp-cron, tendo sido lançado, faz seu trabalho até terminar ou ficar sem tempo de execução.

Essa conexão HTTP é onde alguns sistemas mal configurados falham. Basicamente, o WordPress está agindo como um navegador da web. Se seu site era http://example.com/blog , o WP ligará para http://example.com/blog/wp-cron.php para iniciar o processo. No entanto, alguns servidores simplesmente não podem fazer isso por algum motivo. Entre os possíveis motivos:

  1. O servidor não possui DNS e, portanto, não consegue descobrir quem é "example.com", mesmo que seja ele próprio .
  2. Os administradores de servidor, em uma tentativa equivocada de segurança, bloquearam solicitações de "loopback", de modo que não é possível fazer uma chamada de volta para si mesma.
  3. O servidor está executando algo chamado "mod_security" ou similar, que bloqueia ativamente a chamada devido à configuração com morte cerebral.
  4. Algo mais.

O ponto é que, por qualquer motivo, seu servidor da Web está configurado de alguma maneira não padrão que impede o WordPress de fazer seu trabalho. WordPress simplesmente não pode consertar isso.

No entanto, se você tiver essa condição, há uma solução alternativa. Adicione isso ao define no seu arquivo wp-config.php:

define ('ALTERNATE_WP_CRON', verdadeiro);

Esse método alternativo usa uma abordagem de redirecionamento, que faz com que o navegador dos usuários obtenha um redirecionamento quando o cron precisar ser executado, para que eles retornem ao site imediatamente enquanto o cron continuar sendo executado na conexão que acabaram de cair. Este método é um pouco duvidoso às vezes, e é por isso que não é o padrão.

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

Conforme declarado nesta publicação excelente e detalhada, se você não tiver controle sobre a configuração dos servidores ou, se aplicável, o ambiente - uma solução alternativa é colocar

define ('ALTERNATE_WP_CRON', verdadeiro);

no seu arquivo wp-config.php.

ohaal
fonte
3
Relatório muito bom!
Brasjilo
2
É bom quando as pessoas resolvem seus próprios problemas, mas incrível quando elas voltam para deixar a solução. @ ohaal Então, está tudo bem agora?
its_me
11
@AahanKrish: Acontece que eu fui um pouco rápido no dedo no gatilho. O problema foi um pouco mais complicado do que o esperado - o culpado não foi, como inicialmente previsto, o erro apache2. Atualizei minha resposta com os detalhes.
ohaal