问题描述

我正在创建一个运行在 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。