30

ob_start通常/ob_get_clean()被 php 程序员认为是不好的做法吗?

输出缓冲有什么缺点吗?

4

8 回答 8

22

这实际上是一个很好的做法。加快数据传输

于 2011-01-19T03:17:07.323 回答
15

在某些情况下,输出缓冲几乎是强制性的。使用 PHP,只要您将某些内容输出回用户,就会发送标头。因此,如果您在处理页面的过程中遇到了需要发送标头的事情,除非打开缓冲,否则您将无法做到这一点。否则你会得到可怕的“无法修改标头信息 - 标头已发送”。

有些人会告诉你你不应该那样编码。骗子我说!

打开缓冲区后,您的代码可以更加灵活。

于 2011-01-19T03:29:33.987 回答
10

输出缓冲不是一个坏习惯。例如,它可以通过使用 GZIP 压缩来加快网站的加载速度(尽管如果可能的话,最好在 .htaccess 中执行此操作)。

<?php 
    if (substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')) 
        ob_start("ob_gzhandler"); 
    else 
        ob_start(); 
?>

缺点:不知道。好问题。

PS:我也发现了这个关于输出缓冲的话题。

于 2011-01-19T03:16:04.883 回答
7

对于程序效率,输出缓冲区捕获也不错。这是 PHP 的一个有用的特性。但是,它可以用于用其他方法更好地完成的事情。代码异味可能是一个问题,因此请确保没有更好、更清晰的解决方案来解决您的问题。

于 2011-01-19T03:20:26.997 回答
4

它不被认为是坏的(或好的)。有些人喜欢它,有些人不喜欢我个人认为有理由不使用它。我认为这是最后的手段。有时您可能会遇到输出缓冲可能是解决特定问题的唯一选择的情况,因此请将此选项保存在此类情况下。

我不认为使用它可以提高性能或加快页面加载速度,但这也取决于您使用的服务器以及您使用 php 作为 mod_php 还是 cgi 或 fastcgi。

于 2011-01-19T03:33:48.653 回答
3

输出缓冲的主要缺点是不知道(或注意)你的缓冲堆栈有多深。将其与过于激进的错误处理或意外退出/死亡的子例程结合起来,您将丢失缓冲区中的任何内容,几乎没有关于正在发生的事情的线索。

例如,Zend 框架对几乎所有内容都使用了输出缓冲,但是当它遇到严重错误时,它会打印一条消息并立即退出。任何有用的调试信息都会丢失。

于 2011-01-19T05:33:03.123 回答
1

当然,输出缓冲意味着本来可以立即发送到浏览器的内容现在停留在服务器上,这会占用额外的内存(如果您正在处理高可伸缩性,这是一个非常重要的问题)所以如果您的程序正在占用执行一段时间,这种内存开销会影响性能。

我对 PHP 的了解还不够充分,无法说出这是否属实,或者当您不使用缓冲时它是否会释放内存,但这通常是理论。

于 2011-05-17T13:08:03.477 回答
1

如果我没记错的话java也有这个输入和输出缓冲来读写文件。

于 2011-01-19T03:10:25.243 回答