如何判断是否ob_start();已被称为

时间:2011-05-15 18:40:42

标签: php output-buffering

我使用输出缓冲进行gzip压缩并访问以前在PHP脚本中输出的内容:

if(!ob_start("ob_gzhandler")) ob_start();

现在,如果该脚本包含在另一个已经使用ob_start()的脚本中,我会收到警告:

  

警告:ob_start()[ref.outcontrol]:输出处理程序'ob_gzhandler'在第n行的文件名中不能使用两次

所以我想测试已经被调用的ob_start()。我认为ob_get_status()应该是我需要的,但是在测试中使用它的最佳方法是什么?

4 个答案:

答案 0 :(得分:14)

ob_get_level返回活动输出控制处理程序的数量,ob_list_handlers返回这些处理程序的提升。所以你可以这样做:

if (!in_array('ob_gzhandler', ob_list_handlers())) {
    ob_start('ob_gzhandler');
} else {
    ob_start();
}

虽然一般情况下你可以随意调用ob_start,但使用ob_gzhandler作为处理程序不能像压缩已经压缩的数据一样。

答案 1 :(得分:10)

if (ob_get_level())
    echo "ob already started";

答案 2 :(得分:5)

一般:

if (ob_get_status())  {
  // ob started
}

更具体

$status = ob_get_status();
if ($status['name']=='ob_gzhandler') {
 // ob named ob_gzhandler started
}

答案 3 :(得分:3)

用这种方式怎么样?

if (ob_get_level() == 0) ob_start();