2009-02-08 234 views
3

我写一个PHP脚本和地方我header()功能之前,我已打印文本在此浏览器造成我header()功能给我一个众所周知的错误:输出缓冲区

Warning: Cannot modify header information - headers already sent.

现在的问题是,我有在header()函数之前和之后使用ob_start()ob_flush()的意图。但是我曾经听说过类似输出缓冲区的东西会影响应用程序的性能。那是多么真实?

或者我应该坚持打印Javascript功能重定向页面的想法。

谢谢你的时间。

+1

我非常感谢你的时间和对我的问题的积极贡献。现在我明白了更好的东西,尤其是输出缓冲区让我困惑了一阵子。在所有的帖子后,我一直可以用正确的方法来。感谢你们,你们都为我省了很多心思。 – 2009-02-08 23:14:59

回答

4

使用的输出缓冲器需要服务器来存储PHP的整个输出在RAM中,所以如果它是一个大页面,你将使用相当数量的内存结束 - 而且服务器也必须等到整个页面生成才发送出去,这可能会导致一个小的延迟。但除此之外,我不认为在使用输出缓冲区方面有很多缺点。对于你想要做的,这当然是一个合理的解决方案。

+0

+1表示在调用ob_flush()之前数据未流式传输,这会导致加载时间变慢(但不是必需的较慢生成时间)。 – strager 2009-02-08 21:02:55

+0

我有一个关于这个话题的问题,我可以与你[这里](http://chat.stackoverflow.com/rooms/83235/room-for-sajad-and-david-z)? – Shafizadeh 2015-07-14 15:59:57

5

We should forget about small efficiencies, say about 97% of the time: premature optimization is the root of all evil.

测试ob_start和朋友看看是否性能差异很重要。如果是这样,寻找替代品。

最简单的选择是在打印前移动header()呼叫。

正如你可能喜欢的东西进行重新定位:

header('Location: /new/location/'); 

你不应该这样header()调用之前打印任何东西,因为客户不会跟你反正打印的数据什么(除非有件事情我我错过了HTTP)。

(JavaScript是不是重定向一个很好的选择,而且也不是meta清爽,除非你想检测的Javascript出于某种原因。)

0

只是回答你的最后一句话:你可以在PHP中使用header('Location: '.$url)任何其它输出之前,应该去明显的重定向页面,并建议应遵循exit();

+0

这是他的问题,他已经打印输出。 – 2009-02-08 21:01:30

2

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

  1. 将代码拆分为模型(数据处理)和查看(输出)(请参见MVC)。这意味着即使在显示任何内容之前,您也正在做出重新定位的决定。我会这样称呼这种方式。
  2. 如果你真的需要显示输出(或发送其他头),常见的方式是结合JS和HTML(在无脚本):

    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; 
    } 
    

附:该代码是一个Fusebox框架。