【问题标题】:Shall I use output buffering (ob_start) or not我是否应该使用输出缓冲(ob_start)
【发布时间】:2013-12-16 15:33:03
【问题描述】:

我已经修改了我的 PHP 代码,以避免在发现它表示编码模式不佳后使用输出缓冲。但仍然在不可避免地需要它的地方使用它。

但是,有些文章说使用输出缓冲是有益的,因为它将输出合并为一个,默认情况下,输出会分别分解为 html 和 headers,然后显示在浏览器上,但是输出缓冲消除了这种破坏过程,因此提高输出显示给最终用户的速度。

这篇文章的所有内容都让我陷入了使用或完全避免输出缓冲的两难境地。我不确定它的工作方式和我提到的几点是否完全正确。 所以请相应地指导我。

【问题讨论】:

    标签: php output-buffering ob-start


    【解决方案1】:

    有时使用输出缓冲是一件好事,但要像很多人一样使用它(例如,在输出之前不必发送标头的惰性方式)时机不对。

    你给出的例子,我不太了解,但如果它是最佳的,它可能是它很好用的时代之一。
    不禁止使用ob_start(),只是按照我之前所说的方式使用它的“错误方式”。

    您提到的优化感觉像是一个非常低级的优化,您可能会得到一点点“更快”的输出,但标准 php 脚本中通常有很多其他优化能不能提速才值得一看!

    编辑: 一个在输出前不使用发送标头的小脚本与使用的小脚本示例:

    <?php
    $doOutput = true;
    $doRedirect = true;
    $output = "";
    if($doOutput == true){ 
        // $doOutput is true, so output is supposed to be printed.
        $output = "Some output yay!";
    }
    if($doRedirect == true){ 
        // but $doRedirect is also true, so redirect will be done.
        header("location:anotherpage.php");  // This will not produce an error cause there was no output!
        exit();
    }
    // The echo below will not be printed in the example, cause the $doRedirect var was true.
    echo $output;
    

    而不是(这种情况下会产生输出错误后发送的标头):

    <?php
    $doOutput = true;
    $doRedirect = true; 
    if($doOutput == true){ 
        //Output will be printed, cause $doOutput is true.
        echo "Some output yay!";
    }
    if($doRedirect == true){ 
        // but $doRedirect is also true, so redirect will be done.
        header("location:anotherpage.php");  // This will produce an error cause output was already printed.
        exit();
    }
    

    edit2:更新了一个更明显的例子!

    【讨论】:

    • 好的先生,当我使用它的时候,我把它放在我的脚本的顶部,作为我所有 php 脚本文件的第一行......对吗?还有其他出路吗?什么是正确和正确的使用方法。如果可能的话,请彻底指导我。我真的坚持下去了。
    • 好吧,取决于你把它放在所有文件顶部的原因!是不是因为您收到“输出后无法发送标头”(或类似)消息?然后我会在代码中推荐另一种方法。我从未遇到过必须在输出后发送标头的情况。
    • 好吧,在重定向之前不要做任何输出。它不应该是必需的,因为如果您重定向,用户无论如何都不会看到任何输出。例如,您可以;将所有数据存储在变量中,并在到达脚本的“输出部分”时将其回显(这将在发送标头之后,也就是说,如果未发送标头,则实际上回显输出)。
    • 好的先生,我会将重定向代码移到 html 上方,从而消除输出缓冲使用
    • 对,更新了一个更明显的例子和 cmets。希望它更清楚:P
    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2016-06-20
    • 2011-03-28
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    相关资源
    最近更新 更多