2013-06-19 37 views
1

我发现,所提出的建议使用ob_功能,所有这些emphase益处在互联网上几篇文章,并且没有使用上述功能的缺点。输出缓冲?为什么不?

我的问题是使用ob_函数或设置ini_set('output_buffering', '1');有什么缺点?

+2

内存消耗大多数。 –

+0

另外,你有什么来源? –

+1

来自文档:'某些Web服务器(例如Apache)在调用回调函数时更改脚本的工作目录。您可以通过例如CHDIR(目录名($ _ SERVER [ 'SCRIPT_FILENAME']))在回调function.' –

回答

1

使用输出缓冲的利弊完全取决于你使用的上下文。

一个输出缓冲的最大缺点是运行时错误消息或警告可能会抑制,而你有时可能会结束了错误的数据。

考虑这个例子:

如果其中fetch_template_and_renderdo_render抛出运行时错误,他们会被人抛弃到你的输出,并最终在这个例子将在数据库或高速缓存告终。

这里有2个片段,展示了我的意思,你可以自己尝试

#1

<?php 
    echo 1/0; 
?> 

输出

Warning: Division by zero on line 1 

#2

<?php 
    ob_start(); 
    echo 1/0; 
    $var = ob_get_clean(); 
?> 

输出没有。

为了避免这样的情况下,你需要勤于错误检查和采取预防措施。

努力时使用,ob_ *功能是非常强大的,超级有用。

+0

无论如何,错误都应该单独处理,使用'set_error_handler()'。 –

-1

下面是ob_功能相当不错的使用:

ob_start("ob_gzhandler");

只要zlib的扩展在支持PHP的,应该保证你的输出是GZ-压缩。它显着加快了大页面的页面传输速度。

+2

与生活中的一切一样,这取决于上下文有负面影响。你刚才提到了一个加号,没有提到可能的缺点,并且有很多。此外,这不是问题的答案,也许你应该将它作为评论发布(尽管并没有让你失望)。 –

0

有没有主要的缺点,在适当的实施,使用输出缓冲。

输出缓冲可以允许错误/警告/通知(除停止错误外)出现在输出中,而不会显而易见。这通常是通过适当的错误检查,PHP环境的更好的配置和良好的错误处理程序的实现(如一个转换错误ErrorExceptions可与try/catch语句捕获解决 - 看到Whoops!为错误处理程序示例使用ErrorExceptions)。

内存可能是一个缺点,但对于大多数脚本来说,输出大小通常是微不足道的。发送大量数据的情况下,诸如使用fpassthru递送文件内容到这种情况的一个例外可能是。这可通过写该内容到输出之前关闭输出缓冲(ob_end_clean或ob_end_flush)来解决。

0

内存消耗是最重要的缺点。我最近构建了一个PHP脚本,用于输出大量的几兆字节的XML数据。这个'页面'的框架是使用的输出缓冲的一部分。通过输出缓冲,您需要一个足够容纳所有数据的内存缓冲区。在我的情况下,它不是,脚本失败。

如果输出的数据直接传送给客户端,你就没有这个问题。在这种情况下以及吞吐文件时,这尤其重要。在生成“正常”HTML页面的情况下,您可能不会占用整个缓冲区,但如果同时有多个请求,则仍需要大量内存。

如果没有缓冲,数据消失了,不麻烦你的服务器了。只要数据被缓冲,就可以改变或刷新数据,但实际上会给服务器带来负担。