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