常用知识 - ob

  • 作者:KK

  • 发表日期:2016.9.2


在PHP里有个缓冲区俗称ob(OutputBuffer),默认是关闭的,当你开启缓冲区后,你echo的字符串会先进入缓冲区,当PHP运行结束后才会将缓冲区的内容输出给客户端

开启缓冲区的方法:执行ob_start();

关闭缓冲区的方法:ob_end_clean();

获取缓冲数据并且关闭缓冲区的方法:ob_get_clean();

还有其它一系列的ob_xxx函数学完本节后请自行百度关键词php ob_start了解更多

以下示例代码放在一个纯测试脚本下运行,不会有任何输出:

$str = 'abc';
ob_start();	//开启缓冲区
echo $str;	//开启后,字符串被底层自动中转输出到缓冲区
ob_end_clean();	//关闭了缓冲区,导致没有任何东西发送到客户端

实现后来居上

那我们平时都是为了输出东西给客户端,这下输出的东西又不给客户端,这缓冲区不是来捣乱吗?

接下来看看这个:

$str = 'abc';
ob_start();	//开启缓冲区
echo $str;	//开启后,字符串被底层自动中转输出到缓冲区
$outputBufferContent = ob_get_clean();	//获取缓冲区所有内容,然后关闭缓冲区

echo '嘿嘿,后来居上!<br/>';
echo $outputBufferContent;

这样看似先'abc'先被echo的,可是,可是它却排在了中文的后面,就因为输出abc时开启了缓冲区,它没有被发送到客户端,而事先被发送到客户端的反而是中文字符串,后来才将从缓冲区取出的abc输出了给客户端


应用领域

比较典型的应用领域就是模板,假设一个模板里有如下代码

<div>
	<h3><?php echo $newsTitle; ?></h3>
	<div><?php echo $newsContent; ?></div>
</div>

然后设定一个getTemplateContent方法来获取模板内容:

function getTemplateContent($模板路径, $aParams = []){
	ob_start();
	extract($aParams);
	include($模板路径$html = ob_get_clean();
	return $html;
}

你还可能会疑问,模板内容最终都是输出给浏览器,这下又阻止它出去是干嘛?

那就是新手一般都会犯的思维老毛病:总是以为应用场合肯定是这样的,总是以为一定要输出给浏览器

其实这样可以实现前端“生成静态页面“按钮的功能(你应该在一些cms里见过),后端就是

$aNews = [
	'id' => 111,
	'title' => '京广高速出车祸了',
	'content' => '昨日入城市,归来泪满巾,如今出车祸,早知不去了。',
];
$html = getTemplateContent(VIEW_PATH . '/news.php', [
	'newsTitle' => $aNews['title'],
	'newsContent' => $aNews['content'],
]);	//传入模板名和参数

file_put_content(WEB_PATH . '/news' . $aNews['id'] . '.html', $html);
echo '生成完毕,请通过  http://xxx.com/news/news' . $aNews['id'] . '.html  地址来访问新闻内容';