Esecuzione di WordPress sulla riga di comando - Disattiva l'output ritardato?


8

Sto creando un lavoro cron che viene eseguito al di fuori di WordPress. Dal punto di vista dello sviluppo, questo rende davvero facile il debug e la creazione di script di cleanup o cron job, semplicemente eseguendo un comando come il seguente sulla riga di comando:

php myfile.php

Il mio problema è che WordPress in qualche modo ritarda tutto l'output ... in genere quando si eseguono file php in questo modo l'output viene generato sullo schermo in tempo reale.

Qualcuno sa come impedire a WP di ritardare tutto l'output fino alla fine del lavoro? Probabilmente è un semplice parametro che mi manca durante l'esecuzione del file PHP, o una costante di qualche tipo, ma non sono sicuro.

Nel codice seguente, ti aspetteresti di avere un ritardo di 1 secondo tra ogni output, invece, al momento ottengo tutte le informazioni stampate alla fine, contemporaneamente:

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";

Credo che abbia a che fare con le impostazioni sul server e non con WordPress stesso. Ho testato il tuo codice e funziona come previsto sul mio server durante l'esecuzione dalla riga di comando. Hai qualche plugin che forse memorizza nella cache?
Kokarn

@Kokarn hai ragione. Avrei dovuto testarlo in un'altra installazione di WP. Sembra che stia usando W3 Total Cache. Pubblicheremo qui l'eventuale soluzione (anziché semplicemente disattivare il plug-in).
Alex Cook,

Risposte:


10

Dopo alcuni test, sia WP Super Cache che W3 Total Cache non rilasciano il buffer (né impediscono il rilascio del buffer).

La disattivazione del "ritardo di output" è semplice e dipende dal plug-in di cache in questione.

WP Super Cache :

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

Questo dovrebbe essere aggiunto dopo l'inclusione wp-load.php, questo arresta qualsiasi memorizzazione nella cache morta nelle sue tracce e svuota il buffer.

W3 cache totale :

ob_end_clean(); // or ob_end_flush();

Come sopra, chiama dopo aver incluso wp-load.php, in modo simile a quello che hai lì; dovrebbe funzionare solo con il flushing, W3 Total Cache avvia il buffer, tuttavia non sembra impedire il suo flushing di per sé. A giudicare dal modo in cui l'output è ancora memorizzato nella cache e il flushing non funziona, direi che hai WP Super Cache, che è più aggressivo.

Assicurati di non avviare un nuovo buffer prima di includerlo wp-load.php, altrimenti avrai un buffer all'interno di un buffer (bufferception?) E dovrai svuotare due o più volte.


Grazie - questa risposta è particolarmente utile con l'esempio di codice. Non ho ancora avuto il tempo di provare, ma vado a controllare adesso.
Alex Cook

Sto usando W3 Total Cache. Sembra che "wp_cache_disable" non sia una funzione valida - è specifico per Super Cache?
Alex Cook,

Sì, wp_cache_disable()è particolare per WP Super Cache. Esaminerò W3 Total Cache per vedere come può essere disabilitato in modo simile, usando ha ob_end_flushfunzionato per me. Quali sono le impostazioni e la versione di W3 Total Cache?
soulseekah,

Ho modificato la mia risposta.
Soulseekah,

Assicurati di non avviare un nuovo buffer prima di includere wp-load.php, altrimenti avrai un buffer all'interno di un buffer.
Soulseekah,

4

Disabilita eventuali plugin che potresti avere nella cache di tutta la pagina. WP-Super-Cache, W3 Total Cache, ecc.

WordPress non "ritarda l'output". Ma i plug-in di cache di tutta la pagina di solito lo fanno. Questo perché stanno cercando di ottenere quell'output e salvarlo da qualche parte, per un uso successivo nel servire la pagina. Pertanto, l'output della pagina viene ritardato fino alla fine, dove il plug-in può memorizzarlo nella cache.


Ahhh, buona cattura. Avrei dovuto pensarci! Proverò e ti risponderò. Grazie.
Alex Cook
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.