【问题标题】:Can I use ob_clean() without ob_start() before?我可以在没有 ob_start() 的情况下使用 ob_clean() 吗?
【发布时间】:2019-01-31 00:56:51
【问题描述】:

我不习惯ob_* 函数,我从阅读文档开始。
我想在 method 中使用ob_clean(),但文档说:

输出缓冲区必须由带有PHP_OUTPUT_HANDLER_CLEANABLE 标志的ob_start() 启动。否则 ob_clean() 将不起作用。

但是我尝试了(只是想看看它“行不通”)

echo 'a';
ob_clean();
echo 'b';

哪个输出b。在这里一切似乎都很好,但是按照文档,它不应该,应该吗?

  • ob_start()ob_* 函数的必填项吗?
  • 是否有默认值允许省略 ob_start() 的变量(例如在 php.ini 中)?
  • 我应该如何理解ob_clean() 不起作用”?我应该期待什么?

【问题讨论】:

    标签: php output-buffering ob-start


    【解决方案1】:

    简短的回答是,是的,您必须先打开输出缓冲才能使用ob_clean。但是,您可以通过output_buffering ini 参数为所有文件启用输出缓冲(请参阅manual)。检查的方法是通过ob_get_level()

    echo ob_get_level();
    

    如果结果非零,则启用输出缓冲。

    如果您在未启用缓冲的情况下使用 ob_clean(),您应该会看到类似以下的错误:

    注意:ob_clean() [ref.outcontrol]:删除缓冲区失败。不 要删除的缓冲区。在[文件路径]

    【讨论】:

    • 然后我可以验证是否使用ob_get_level() 启用了输出缓冲,但在输出后调用ob_start() 是否允许我使用ob_clean() 擦除此输出?
    • ob_clean() 只会在匹配ob_start() 后删除输出。因此ob_start() 之前的任何输出都不会受到ob_clean() 的影响。
    • 如果自动启用输出缓冲,调用ob_clean() 将删除该点之前的所有输出,正如您在测试用例中看到的那样。
    • 当我使用 @ob_clean(); 时,我正在通过 csv 导出内容; @ob_start() 然后我在导出 CSV 文件中得到了随机字符,当我删除了这些函数然后导出工作正常,那么它背后的问题是什么?
    • @BhavinThummar 没有看到你的代码和数据很难分辨。你应该问一个问题。
    猜你喜欢
    • 2017-12-31
    • 2016-08-11
    • 2021-08-10
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-03
    相关资源
    最近更新 更多