Php 输出缓冲区如何降低性能

Php 输出缓冲区如何降低性能,php,output-buffering,Php,Output Buffering,我正在编写一个php脚本,在我的header()函数之前的某个地方,我已将文本打印到浏览器,因此导致我的header()函数出现一个众所周知的错误: 警告:无法修改标题信息-标题已发送 现在我的问题是,我打算在header()函数之前和之后使用ob\u start()和ob\u flush()。但我曾经听说,输出缓冲区会对应用程序的性能产生负面影响。这有多真实 或者我应该坚持打印Javascript函数来重定向页面 谢谢你抽出时间 我们应该忘记小效率,比如说97%的时间:过早优化是万恶之源 测试

我正在编写一个php脚本,在我的
header()
函数之前的某个地方,我已将文本打印到浏览器,因此导致我的
header()
函数出现一个众所周知的错误:

警告:无法修改标题信息-标题已发送

现在我的问题是,我打算在
header()
函数之前和之后使用
ob\u start()
ob\u flush()
。但我曾经听说,输出缓冲区会对应用程序的性能产生负面影响。这有多真实

或者我应该坚持打印Javascript函数来重定向页面

谢谢你抽出时间

我们应该忘记小效率,比如说97%的时间:过早优化是万恶之源

测试
ob_start
和朋友,看看性能差异是否重要。如果有,寻找替代方案

最简单的选择是在打印之前移动
header()
调用

因为您可能会使用以下内容执行重定向:

header('Location: /new/location/');
在调用
header()
之前,您不应该打印任何内容,因为客户端无论如何都不会对您打印的数据执行任何操作(除非我对HTTP缺少什么)


(Javascript不是重定向的好选项,
meta
也不是刷新,除非您出于某种原因想要检测Javascript。)

使用输出缓冲区要求服务器将PHP的整个输出存储在RAM中,因此如果是一个大页面,您将使用相当多的内存,服务器也将不得不等待整个页面生成后再发送出去,这可能会导致一点延迟。但除此之外,我不认为使用输出缓冲区有什么缺点。对于您想要做的事情,这当然是一个合理的解决方案。

只是回答您的最后一句话:您可以使用
标题('Location:'.$url)在php中重定向页面。
它显然应该放在任何其他输出之前,并且建议后面跟着
exit()

输出后在PHP代码中重新定位可能说明应用程序设计不好。 但我不知道你的情况,我可以提出两种可能的方法

  • 将代码分为模型(数据处理)和视图(输出)(请参阅)。这意味着您甚至在显示任何内容之前就已经做出了重新定位的决定。我宁愿这样称呼
  • 如果您确实需要显示输出(或发送的其他标题),常用的方法是将JS和HTML(在noscript中)结合起来:

    if(headers\u sent()){
    打印('(document.location.replace)?document.location.replace(“.$location.”):document.location.href=“.$location.”;“.\n.”);
    }否则{
    标题('Location:'。$Location);
    出口
    }
    

  • 另外,这段代码是Fusebox框架的一部分。

    +1用于指出在调用ob_flush()之前数据不会流化,这将导致加载时间变慢(但不一定会导致生成时间变慢)。我对该主题有疑问,我能跟你们说点什么吗?我非常感谢你们大家花时间和对我的问题做出的积极贡献。现在我对事情有了更好的理解,尤其是让我困惑了一段时间的输出缓冲区。在所有的帖子之后,我终于找到了正确的方法。谢谢大家,你们帮我省去了很多思考。谢谢你们的建议。从项目一开始就应该应用MVC技术。除了zend框架,你还可以推荐哪种框架?实际上,大多数流行的框架都迫使你以某种形式使用MVC。此外,它们还会给你带来很多其他好处,例如,干净的应用程序结构、ORM等。示例:很好,但需要一些学习才能开始使用,似乎更容易开始。哦,在我看来,最重要的是:即使你现在花些时间将现有的开发代码转移到框架中,你也会在将来保存它。
    if (headers_sent()) {
        print('<script type="text/javascript">( document.location.replace ) ? document.location.replace("'.$location.'") : document.location.href = "'.$location.'";</script>'."\n".'<noscript><meta http-equiv="Refresh" content="0;URL='.$location.'" /></noscript>');
    } else {
        header('Location: '.$location);
        exit;
    }