【问题标题】:Whats the point of using ob_start without any parameters in PHP在 PHP 中使用不带任何参数的 ob_start 有什么意义
【发布时间】:2010-06-18 19:20:08
【问题描述】:

我可以看到带有output_callback 参数集的ob_start 的使用,但是在没有设置任何参数的情况下调用它时我看不到ob_start 的使用。

禁用输出以便稍后一次性抛出所有输出有什么意义?由于仅在页面完全呈现后(或调用ob_end_flush 时)才开始下载,这不会使用更多内存(服务器端)和缓慢的下载(客户端)吗?

ob_start();
for ($i = 1; $i <= 15; $i++)
{
    echo $i, ' ';
    sleep(1);
}
ob_end_flush();

任何人都可以告诉我在不设置任何参数的情况下使用ob_start() 的用法/优点(如上面的 sn-p)。

【问题讨论】:

    标签: php caching buffering ob-start


    【解决方案1】:

    一个原因,是为了“抓取”一小段代码的输出。

    所以,假设您有一段独立的代码要执行,但您不想直接输出它。你能做的,是

    ob_start();
    include 'file.php';
    $output = ob_get_clean();
    

    我会给你一个真实的例子。假设您正在为应用程序构建安装程序。作为该安装程序的一部分,您希望显示当前的 PHP 信息(来自phpinfo() 的数据)。但是,您希望将该信息与页面的其余部分集成(而不是使用框架)。因此,您可以使用输出缓冲区获取phpinfo() 的输出,对其进行修改,然后将其显示在模板文件中您想要的位置。

    ob_start();
    phpinfo();
    $info = ob_get_clean();
    //Massage the output, remove the doctype, html, head, and body tags
    echo $info;
    

    我也将它与视图文件一起使用。在 View 类中,__toString() 方法实际上渲染了视图。但是由于 __toString() 预计会返回一个字符串而不是回显它,所以我使用输出缓冲来捕获模板并返回它...

    【讨论】:

      【解决方案2】:

      如果您有一个 PHP 脚本,它使用 echo 以许多小片段的形式输出,事实证明,如果您使用 ob_start() 进行缓冲,然后在完成后将其全部刷新,那么 PHP 脚本会运行得更快。

      (注意:这只是来自 PHP 核心开发人员的博客的报告;我自己没有测试过,所以我没有具体的数字说明它的速度多少。)

      是的,它将缓冲区保存在内存中,但您的 HTML 输出有多大?与 PHP 环境的内存限制相比,可能非常小。

      是的,它会延迟输出直到全部完成,但由于 PHP 运行速度更快,总运行时间会更短。您的 Apache 线程越早转移到另一个请求,您的网站的可扩展性就越好。

      这并不是说每个页面都受益于使用输出缓冲。在典型的 PHP 脚本中,这种好处可能是微不足道的,它主要是带有一些可变元素的静态 HTML。

      【讨论】:

        【解决方案3】:

        一种用法是在脚本准备好发送其内容之前阻止 php 发送标头,因为这将允许您在构建输出时更改标头。

        阅读这是一篇关于输出缓冲的文章,以获得更多关于如何使用它的想法。 http://www.devshed.com/c/a/PHP/Output-Buffering-With-PHP/

        【讨论】:

          【解决方案4】:
          1. 确保您没有收到“标头已发送”错误
          2. 捕获所有html数据以创建缓存文件

          我只会将它用于 2,因为我认为 1 无论如何都不应该发生

          【讨论】:

            猜你喜欢
            • 2011-05-23
            • 1970-01-01
            • 2020-01-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-01-03
            • 1970-01-01
            相关资源
            最近更新 更多