Ausführen von WordPress in der Befehlszeile - Verzögerte Ausgabe deaktivieren?

8

Ich erstelle einen Cron-Job, der außerhalb von WordPress ausgeführt wird. Aus Entwicklungssicht macht es das Debuggen und Erstellen von Bereinigungsskripten oder Cron-Jobs wirklich einfach, indem Sie einfach einen Befehl wie den folgenden in der Befehlszeile ausführen:

php myfile.php

Mein Problem ist, dass WordPress irgendwie die gesamte Ausgabe verzögert ... normalerweise wird die Ausgabe auf Ihrem Bildschirm in Echtzeit generiert, wenn Sie PHP-Dateien wie diese ausführen.

Weiß jemand, wie man verhindert, dass WP die gesamte Ausgabe bis zum Ende des Jobs verzögert? Es ist wahrscheinlich ein einfacher Parameter, den ich beim Ausführen der PHP-Datei vermisse, oder eine Konstante, aber ich bin mir nicht sicher.

Im folgenden Code erwarten Sie eine Verzögerung von 1 Sekunde zwischen den einzelnen Ausgaben. Stattdessen werden derzeit alle Informationen am Ende auf einmal gedruckt:

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
quelle
Ich glaube, es hat mit den Einstellungen auf dem Server zu tun und nicht mit WordPress selbst. Sie haben Ihren Code getestet und er funktioniert wie vorgesehen auf meinem Server, wenn er über die Befehlszeile ausgeführt wird. Haben Sie Plugins, die vielleicht zwischengespeichert werden?
Kokarn
@ Kokarn du bist richtig. Ich hätte dies in einer anderen WP-Installation testen sollen. Sieht so aus, als würde ich W3 Total Cache verwenden. Wird die mögliche Lösung hier zurück posten (anstatt nur das Plugin zu deaktivieren).
Alex Cook

Antworten:

10

Nach einigen Tests geben sowohl der WP Super Cache als auch der W3 Total Cache den Puffer nicht frei (oder verhindern, dass der Puffer freigegeben wird).

Das Ausschalten der "Ausgangsverzögerung" ist einfach und hängt vom jeweiligen Caching-Plugin ab.

WP Super Cache :

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

Dies sollte nach dem wp-load.phpEinfügen hinzugefügt werden. Dadurch wird das Caching in seinen Spuren gestoppt und der Puffer geleert.

W3 Gesamt-Cache :

ob_end_clean(); // or ob_end_flush();

Rufen Sie wie oben an, nachdem wp-load.phpSie eingeschlossen haben, ähnlich wie Sie es dort haben. Sollte nur mit Leeren funktionieren, startet W3 Total Cache den Puffer, scheint jedoch das Leeren an sich nicht zu verhindern. Gemessen an der Art und Weise, wie Ihre Ausgabe immer noch zwischengespeichert ist und das Leeren nicht funktioniert, würde ich sagen, dass Sie WP Super Cache haben, der aggressiver ist.

wp-load.phpStellen Sie sicher, dass Sie vor dem Einfügen keinen neuen Puffer starten , da sich sonst ein Puffer in einem Puffer befindet (Bufferception?) Und zweimal oder öfter geleert werden muss.

Soulseekah
quelle
Danke - diese Antwort ist besonders hilfreich für das Codebeispiel. Ich hatte noch keine Zeit zum Testen, werde es aber jetzt überprüfen.
Alex Cook
Ich verwende W3 Total Cache. "Wp_cache_disable" ist anscheinend keine gültige Funktion - ist das spezifisch für Super Cache?
Alex Cook
Ja, wp_cache_disable()ist speziell für WP Super Cache. Ich werde in W3 Total Cache nachsehen, wie es auf ähnliche Weise deaktiviert werden kann, wenn es ob_end_flushfür mich funktioniert. Was sind Ihre W3 Total Cache-Einstellungen und -Versionen?
Soulseekah
Ich habe meine Antwort bearbeitet.
Soulseekah
Stellen Sie sicher, dass Sie keinen neuen Puffer starten, bevor Sie wp-load.php einfügen. Andernfalls befindet sich ein Puffer in einem Puffer.
Soulseekah
4

Deaktivieren Sie alle Plugins, die möglicherweise das Caching ganzer Seiten durchführen. WP-Super-Cache, W3-Gesamtcache usw.

WordPress "verzögert die Ausgabe nicht". Plugins zum Zwischenspeichern ganzer Seiten tun dies normalerweise. Dies liegt daran, dass sie versuchen, diese Ausgabe abzurufen und irgendwo zu speichern, um sie später für die Bereitstellung der Seite zu verwenden. Somit wird die Seitenausgabe bis zum Ende verzögert, wo das Plugin sie zwischenspeichern kann.

Otto
quelle
Ahhh, guter Fang. Hätte daran denken sollen! Ich werde testen und mich bei Ihnen melden. Vielen Dank.
Alex Cook