Ejecutar WordPress en la línea de comandos: ¿desactivar la salida retrasada?

8

Estoy creando un trabajo cron que se ejecuta fuera de WordPress. Desde una perspectiva de desarrollo, esto hace que sea muy fácil depurar y crear scripts de limpieza o trabajos cron, simplemente ejecutando un comando como el siguiente en la línea de comandos:

php myfile.php

Mi problema es que WordPress retrasa de alguna manera toda la salida ... generalmente cuando ejecuta archivos php como este, la salida se genera en su pantalla en tiempo real.

¿Alguien sabe cómo evitar que WP retrase toda la salida hasta el final del trabajo? Probablemente sea un parámetro simple que me falta al ejecutar el archivo PHP, o una constante de algún tipo, pero no estoy seguro.

En el siguiente código, esperaría tener un retraso de 1 segundo entre cada salida, en cambio, actualmente obtengo toda la información impresa al final, de una 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
fuente
Creo que tiene que ver con la configuración del servidor y no con WordPress. Probé su código y funciona según lo previsto en mi servidor cuando se ejecuta desde la línea de comandos. ¿Tienes algún plugin que tal vez guarde en caché?
Kokarn
@Kokarn tienes razón. Debería haberlo probado en otra instalación de WP. Parece que es porque estoy usando W3 Total Cache. Publicará la solución final aquí (en lugar de simplemente desactivar el complemento).
Alex Cook

Respuestas:

10

Después de algunas pruebas, tanto WP Super Cache como W3 Total Cache no liberan el búfer (o evitan que se libere el búfer).

Desactivar el "retraso de salida" es simple y depende del complemento de almacenamiento en caché involucrado.

WP Super Cache :

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

Esto debe agregarse después de incluir wp-load.php, esto detiene cualquier almacenamiento en caché en seco y vacía el búfer.

W3 Caché total :

ob_end_clean(); // or ob_end_flush();

Igual que el anterior, llame después de incluir wp-load.php, de manera similar a lo que tiene allí; debería funcionar con solo el enjuague, W3 Total Cache inicia el búfer, sin embargo, no parece evitar su enjuague per se. A juzgar por la forma en que su salida todavía está en caché y el vaciado no funciona, diría que tiene WP Super Cache, que es más agresivo.

Asegúrese de no iniciar un nuevo búfer antes de incluirlo wp-load.php, de lo contrario, tendrá un búfer dentro de un búfer (¿recepción de búfer?) Y tendrá que vaciar dos veces o más.

soulseekah
fuente
Gracias, esta respuesta es particularmente útil con el ejemplo de código. Todavía no he tenido tiempo de probarlo, pero voy a comprobarlo ahora.
Alex Cook,
Estoy usando W3 Total Cache. Parece que "wp_cache_disable" no es una función válida, ¿es específica de Super Cache?
Alex Cook
Sí, wp_cache_disable()es particular de WP Super Cache. Examinaré W3 Total Cache para ver cómo se puede deshabilitar de manera similar, utilizando ob_end_flushtrabajado para mí. ¿Cuáles son sus configuraciones y versión de W3 Total Cache?
soulseekah
He editado mi respuesta.
soulseekah
Asegúrese de no iniciar un nuevo búfer antes de incluir wp-load.php, de lo contrario tendrá un búfer dentro de un búfer.
soulseekah
4

Deshabilite cualquier complemento que pueda tener que haga el almacenamiento en caché de toda la página. WP-Super-Cache, W3 Total Cache, etc.

WordPress no "retrasa la salida". Pero los complementos de almacenamiento en caché de páginas enteras generalmente sí. Esto se debe a que están tratando de obtener esa salida y guardarla en algún lugar, para su posterior uso en el servicio de la página. Por lo tanto, la salida de la página se retrasa hasta el final, donde el complemento puede almacenarla en caché.

Otón
fuente
Ahhh, buena captura. Debería haber pensado en eso! Lo probaré y te responderé. Gracias.
Alex Cook