【问题标题】:How to determine wether ob_start(); has been called already如何判断 ob_start();已经被调用
【发布时间】:2011-08-26 00:11:03
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: php output-buffering


    【解决方案1】:

    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 作为处理程序不能像压缩已经压缩的数据一样。

    【讨论】:

    • 我被comment on the manual 激怒了,它声称“有时,ob_get_level() 可能会关闭 1,因为在脚本开始时,即使从未调用过 ob_start(),它也会返回 1 ”。那么这是一种可靠的判断方式吗?
    • @CO:这可能是由于output_buffering:“如果启用了output_bufferingob_start() 使用了匿名函数,ob_list_handlers() 将返回“default output handler”。 ”
    【解决方案2】:
    if (ob_get_level())
        echo "ob already started";
    

    【讨论】:

    • 我被comment on the manual 激怒了,它声称“有时,ob_get_level() 可能会关闭 1,因为在脚本开始时,即使从未调用过 ob_start(),它也会返回 1 ”。那么这是一种可靠的判断方式吗?
    • @C.O.我读过评论,但这不是真的。即使在脚本开始时调用它也会返回 0。你可以看看我的例子:codepad.org/SrZ4YdQn
    • 真的。上周在共享服务器上遇到了它。处理它的最佳方法是在 ob_start() 之前使用 if(ob_get_level())ob_end_clean(); 开始您的代码
    • @Michel 这可能是由于服务器自动启动输出缓冲。
    【解决方案3】:

    一般:

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

    更具体

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

    【讨论】:

    • 这就是我想要的。谢谢。我认为我会使用 Gumbo 的建议。
    【解决方案4】:

    这样用怎么样?

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

    【讨论】:

    • 我被comment on the manual 激怒了,它声称“有时,ob_get_level() 可能会关闭 1,因为在脚本开始时,即使从未调用过 ob_start(),它也会返回 1 ”。那么这是一种可靠的判断方式吗?
    • 至少没有针对此类问题的错误报告。可能是评论者的错。 bugs.php.net/…
    • 可能是的,但正是这条评论让我开始提出这个问题。我想听听一些意见。所以谢谢。
    猜你喜欢
    • 1970-01-01
    • 2012-10-10
    • 2011-07-27
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    相关资源
    最近更新 更多