問題描述

我正在創建一個運行在 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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。