PHP 滥用 ob_get_contents() 来输出内容,会导致什么结果?

2014-08-28 14:20:55 +08:00
 kmvan
遇到个同事,在输出内容的函数他都会使用获取 ob_get_contents 后再 echo 内容。即使:
```
echo 'abc';
// 他也要
?>
abc
<?php
$str = ob_get_contents();
ob_end_clean();
echo $str;
```
这样,十分不解。
9172 次点击
所在节点    程序员
5 条回复
barbery
2014-08-28 14:32:13 +08:00
kmvan
2014-08-28 15:38:25 +08:00
@barbery 原来如此,难怪echo内容越多,处理的时间就越长。这样说来,直接在php页面里面写 <div....> 比 echo '<div...>'; 要好哦
anjianshi
2014-08-28 16:01:18 +08:00
@kmvan 只针对上面给出的代码来看,这种做法完全是多次一举

他绕了那么大一圈,最后还不是用 echo 把这个字符串给打印出来了?
这就已经跟一楼给出的链接没有关系了

打个比方就是:
静脉注射比直接吃药吸收的快
于是他把药静脉注射了之后立刻拦截并抽了出来,然后又用嘴喝了下去
Sunyanzi
2014-08-28 18:14:48 +08:00
首先说 @kmvan 你的想法是错的 ...

直接在标签外面写 html 的确比 echo html 效率更高 ... 但这并不是 echo 的错 ...

这个高效率来源于不经 php 引擎的直接输出 ... 只会快几十微秒而已 ...

如果要输出很长的内容 ... 不管把内容写在标签外还是用 php echo ... 效果几乎是一样的 ...

鸟哥那篇文章的意思是通过开启缓存来减少 php 向 webserver 发送内容的次数 ...

其次说我大概是两个小时前看到这个帖子的 ... 琢磨来琢磨去 ... 也没想出这么做的理由 ...

所以我个人觉得你应该去问问你那个同事这么写是为什么 ... 而不是在论坛发问 ...

如果非要猜 ... 我能想到的唯一的可能性是你的同事需要实时的 raw output ...

从你贴的这段代码里可以看到两个事情 ...

第一 ... 你的同事没有显式的写 ob_start() 就直接用了 ob_get_contents() ...

第二 ... 你的同事没有直接用 ob_end_flush() 而是取得内容之后自行 echo ...

根据这两点我猜测 ... 一种可能是 php 开启了 output_buffering ...

而你的同事等不及在 php 执行完毕时统一输出才选择这种降低承载的方式 ...

另一种可能性是在你的同事碰触不到的代码里会自动执行挂着回调的 ob_start() ...

具体可以参考某些奇葩框架启动内置模板引擎的方式 ...

你的同事并不想自己 echo 的内容被那个回调所处理 ... 所以选择了这种方式 ...

除了这两种之外我想不到其他了 ... 「写习惯了」什么的理论都完全站不住脚 ...

如果你去问了 ... 欢迎回复一下我是否有猜对 ...
dying318
2018-05-03 18:01:02 +08:00
@Sunyanzi 可惜作者没有回复了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/130414

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX