常用知识 - 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 地址来访问新闻内容';