Executando o WordPress na linha de comando - Desativar saída atrasada?

8

Estou criando um trabalho cron que é executado fora do WordPress. Do ponto de vista do desenvolvimento, isso facilita muito a depuração e a criação de scripts de limpeza ou tarefas cron, executando apenas um comando como o seguinte na linha de comando:

php myfile.php

Meu problema é que o WordPress atrasa de alguma forma toda a saída ... normalmente, quando você executa arquivos php como este, a saída é gerada na tela em tempo real.

Alguém sabe como impedir o WP de atrasar toda a saída até o final do trabalho? Provavelmente é um parâmetro simples que estou ausente ao executar o arquivo PHP ou uma constante de algum tipo, mas não tenho certeza.

No código a seguir, você esperaria um atraso de 1 segundo entre cada saída. Em vez disso, recebo todas as informações impressas no final de uma só vez:

set_time_limit( 0 );
ini_set( "memory_limit", "64M" );

ob_start();
require_once( dirname( __FILE__ ) . '/wp-load.php' ); // you need to adjust this to your path
ob_end_clean();

global $wpdb;
$q = $wpdb->prepare ("SELECT * FROM wp_posts LIMIT 5");
$results = $wpdb->get_results ($q);
echo "found " . count ($results) . "\n";

foreach ($results as $post)
{
    echo $post->post_title . "\n";
    sleep(1);
}

echo "\n\ndone";
Alex Cook
fonte
Eu acredito que tem a ver com as configurações no servidor e não com o próprio wordpress. Testei seu código e ele funciona conforme o esperado no meu servidor ao executar na linha de comando. Você tem algum plug-in que armazena em cache, talvez?
Kokarn
@Kokarn você está correto. Eu deveria ter testado isso em outra instalação do WP. Parece que é porque estou usando o W3 Total Cache. Irá postar a solução final aqui (em vez de apenas desativar o plug-in).
Alex Cozinhe

Respostas:

10

Após alguns testes, o WP Super Cache e o W3 Total Cache não liberam o buffer (ou impedem que o buffer seja liberado).

Desativar o "atraso de saída" é simples e depende do plug-in de cache envolvido.

Super cache WP :

wp_cache_disable();
ob_end_flush(); // or ob_end_clean();

Isso deve ser adicionado após a inclusão wp-load.php, isso interrompe qualquer cache morto em suas trilhas e libera o buffer.

Cache Total W3 :

ob_end_clean(); // or ob_end_flush();

O mesmo que acima, ligue depois de incluir wp-load.php, da mesma forma que você tem lá; deve funcionar apenas com a descarga, o W3 Total Cache inicia o buffer, mas não parece impedir a descarga por si só. A julgar pela maneira como sua saída ainda é armazenada em cache e a liberação não funciona, eu diria que você tem o WP Super Cache, que é mais agressivo.

Certifique-se de não iniciar um novo buffer antes de incluir wp-load.php, caso contrário, você terá um buffer dentro de um buffer (bufferception?) E precisará liberar duas ou mais vezes.

soulseekah
fonte
Obrigado - esta resposta é particularmente útil com o exemplo de código. Ainda não tive tempo para testar, mas vou verificar agora.
Alex Cook
Estou usando o W3 Total Cache. Parece que "wp_cache_disable" não é uma função válida - isso é específico para o Super Cache?
Alex Cozinhe
Sim, wp_cache_disable()é particular ao WP Super Cache. Vou examinar o W3 Total Cache para ver como ele pode ser desabilitado de maneira semelhante, usando o ob_end_flushtrabalhou para mim. Quais são as configurações e a versão do cache total do W3?
91712 soulseekah #
Eu editei minha resposta.
soulseekah
Certifique-se de não iniciar um novo buffer antes de incluir wp-load.php, caso contrário, você terá um buffer dentro de um buffer.
soulseekah
4

Desative todos os plug-ins que você tiver para fazer o cache da página inteira. WP-Super-Cache, W3 Total Cache, etc.

O WordPress não "atrasa a saída". Mas os plugins de cache de página inteira costumam funcionar. Isso ocorre porque eles estão tentando obter essa saída e salvá-la em algum lugar, para uso posterior em servir a página. Assim, a saída da página está atrasada até o final, onde o plugin pode armazená-la em cache.

Otto
fonte
Ahhh, boa captura. Deveria ter pensado nisso! Vou testar e voltar para você. Obrigado.
Alex Cozinhe