【问题标题】:ob_get_level() starts at level 1ob_get_level() 从级别 1 开始
【发布时间】:2011-04-08 04:22:38
【问题描述】:

在输出缓冲方面存在一些问题。主要是,我正在尝试使用 ob_gzhandler 回调运行输出缓冲,但它一直告诉我它使用了不受支持的压缩类型。一切都已启用,我认为问题在于在我的脚本开头运行 ob_get_level() 会产生级别 1。php.ini 将我的 output_buffering 设置为 4096。

如果我运行类似:

while(ob_get_level() > 0){
   ob_end_clean();
}

然后我可以使用 ob_gzhandler 回调成功运行 ob_start()。但我想知道这是否应该是一个问题。在我的脚本中,我在不同点调用 ob_clean(),因为我避免堆叠太多缓冲区,因为我读过这可以提高性能。我只是不确定我应该在这里做什么。

干杯。

【问题讨论】:

    标签: php buffer output-buffering


    【解决方案1】:

    您默认启用了输出缓冲(请参阅the docs) - 这基本上意味着每个 PHP 脚本都以 ob_start() 开头。

    如果要禁用所有 PHP 脚本的默认 OB,请在 php.ini 中设置 output_buffering = Off

    如果您只想禁用此特定脚本的默认 OB,请使用 while 循环 - 非常正确。

    至于ob_clean - 您确定要删除缓冲区中的输出吗? IMO 并不是真的有必要,除非您看到页面加载速度很慢。不要担心优化它(至少现在不是)。

    【讨论】:

    • 是的,我相信我会。它设置为:output_buffering = 4096(我在上面说过)。我的意思是,我应该保持原样,然后简单地运行上面的循环,以便我可以开始输出缓冲 ob_gzhandler?
    • @Jason Lewis:这取决于你。我可能会为所有脚本保留默认 OB,并在我想使用自己的情况下使用 while 循环终止它。
    • 我的意思是说我在几个地方使用了 ob_get_clean() ,将输出存储在几个变量中,最终它被刷新。这是一种好方法吗,还是应该为每个要捕获输出的地方启动一个新缓冲区并改用 ob_get_flush() ?
    • 当我运行 ob_start('ob_gzhandler') 然后使用 ob_clean() 时,它实际上似乎不起作用。似乎显示不支持的压缩类型。所以我使用了一个主缓冲区(ob_start()),然后在整个应用程序中捕获所需的输出,然后清理缓冲区。然后在显示最终输出时,我结束主缓冲区并启动一个新的压缩缓冲区,它似乎正在工作。
    猜你喜欢
    • 2021-08-21
    • 2023-04-08
    • 1970-01-01
    • 2022-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多