問題描述
我正在建立一個執行在 WordPress 外的 cron 作業。從開發的角度來看,透過在命令列上執行如下命令,可以很容易地除錯和建立清理指令碼或 cron 作業:
php myfile.php
我的問題是 WordPress 以某種方式延遲所有輸出… 通常當您執行這樣的 php 檔案時,輸出將在螢幕上即時生成。
有誰知道如何防止 WP 延遲所有的輸出,直到工作結束?這可能是我在執行 PHP 檔案時丟失的一些簡單引數,或者某種常量,但我不確定。
在下面的程式碼中,您將期望在每個輸出之間延遲 1 秒,而不是立即收到最後列印的所有資訊:
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 "nndone";
最佳解決方案
經過一番測試,WP Super Cache 和 W3 Total Cache 都不會釋放緩衝區 (或者阻止緩衝區被釋放) 。
關閉”output delay” 很簡單,取決於涉及的快取外掛。
WP 超級快取:
wp_cache_disable();
ob_end_flush(); // or ob_end_clean();
這應該在包括 wp-load.php 之後新增,這樣可以阻止任何快取在其軌道中死亡,並重新整理緩衝區。
W3 總快取:
ob_end_clean(); // or ob_end_flush();
和上面一樣,呼叫包括 wp-load.php,與你在那裡一樣; 應該使用剛剛重新整理,W3 總快取確實啟動緩衝區,但它似乎並沒有阻止它的沖洗本身。根據您的輸出方式仍然快取並且沖洗不起作用,我會說您有 WP 超級快取,這是更積極的。
確保在包括 wp-load.php 之前不啟動新的緩衝區,否則您將在緩衝區 (bufferception?) 中有緩衝區,並且必須要重新整理兩次或更多。
次佳解決方案
停用任何您可以使用 whole-page 快取的外掛。 WP-Super-Cache,W3 Total Cache 等
WordPress 不”delay output” 。但是整個頁面快取外掛通常會做。這是因為他們試圖獲得該輸出並將其儲存在某個地方,以供以後在使用該頁面中使用。因此,頁面輸出被延遲到最後,外掛可以快取它。
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。