PHP输出缓冲?最佳实践是什么?

4

关于我之前的问题,当我想要缓存PHP输出直到所有处理完成时,最好的方法是什么?我希望进行缓冲以留给自己重定向到错误页面的选项,这在任何输出之后都不能做到。

那么,最佳实践是什么?使用变量$output并不断追加,然后在最后输出它?还是使用ob_str()等函数?

是否有性能或代码可维护性原因导致选择其中一种而不是另一种?还是只是个人喜好?


4
虽然这并不是特别相关,但你应该在任何输出生成之前,至少处理可能会引发错误的大部分处理(或者处理)吧? - John Parker
+1 同意。 (填充以使评论> 15个字符) - Mawg says reinstate Monica
3个回答

3

对我来说,我做了这个:

<?php

ob_start();

//do your process here

if($error)
{
  ob_end_clean();
  header('Location: /some/path.php');
  exit;
}
ob_end_flush();

?>

3

我使用ob_start();函数开启一个缓冲区(参考:http://php.net/manual/en/function.ob-start.php)。

然后,除了头部信息外,通常发送到浏览器的所有内容都存储在缓冲区中,直到我关闭它。当我想要输出或操作缓冲区时,可以像这样访问它:

$buffer = ob_get_clean();(参考:http://php.net/manual/en/function.ob-get-clean.php)。

这里有很多其他的缓冲区选项:

http://www.php.net/manual/en/ref.outcontrol.php

在我看来,这是最好的方法,因为只要缓冲区打开,PHP就会自动捕获所有内容,不需要不断地添加项目到缓冲区中。


+1 我倾向于同意并可能会以那种方式做。我只是在寻求确认(或反驳)。 - Mawg says reinstate Monica

1
良好的编码不需要输出缓冲。我的意思是:首先,您进行所有处理,没有任何输出。业务逻辑、验证、数据库访问等等。完成这些后,您可以关闭DB连接、会话等,因为您所做的只是基于上面收集的数据创建输出。
这种方法通常会产生更易维护的代码。

感谢您抽出时间回答。我倾向于同意您的观点,但有一点需要注意...当所有处理都在前端完成时,代码必须记住大量信息,直到所有处理结束,这意味着要么使用大量不易维护的变量,要么使用缓冲区。那么,应该选择哪种方式呢?是为整个页面使用一个大变量,还是使用输出缓冲区(或几十个变量)? - Mawg says reinstate Monica
1
我宁愿有几十个变量和良好的分离,也不要有意大利面式代码。MVC框架可以很好地帮助实现这一点。 - Maerlyn
2
输出缓冲在某些情况下非常有用,这也是为什么它存在于PHP中的原因。 - Casey
+1给两者。Maerlyn,我觉得(希望)我们是用不同的方式表达同样的意思。尽管如此,我并不认为输出缓冲会导致代码混乱。而且,即使使用MVC模式,在构建输出页面时也可能出现错误。所以,似乎只是在将页面构建为一组变量、一个字符串或PHP的输出缓冲中进行选择。 - Mawg says reinstate Monica
@Casey 在某些情况下可能会有用,但在过去的大约两年中,我没有发现任何这样的情况。尽管如此,我同意:它存在是有原因的。 @Leonix 我看到了很多像你这样使用输出缓冲的代码,最终它们中的大部分都演变成了意大利面条代码 - 但并非全部,所以仍然有希望。对于错误,可以使用try-catch。我无法强调框架的实用性。 - Maerlyn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接