php实现bigpipe - 博学无忧


本站和网页 https://www.bo56.com/php%E5%AE%9E%E7%8E%B0bigpipe/ 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

php实现bigpipe - 博学无忧
2022年12月23星期五
首页关于我
PHP7扩展
Tclip
TSSH
kvproxy
博学无忧
信海龙View
首页关于我
PHP7扩展
Tclip
TSSH
kvproxy
搜索
菜单
首页关于我
PHP7扩展
Tclip
TSSH
kvproxy
首页 » 编程语言 » PHP » php实现bigpipe
php实现bigpipe
2013-07-18 信海龙
4条评论 
BigPipe是facebook发明的一种页面加载技术。其实也不是什么新技术了,也有很多文章进行说明。但是在网上,具体讲如何使用php实现bigpipe的文章很少,并且有些文章还不很准确。bigpipe的核心思想是并行,服务器生成数据和浏览器渲染数据的并行。
在实现bigpipe时有几点注意:
1.如果使用nginx作为web服务器,那么nginx可能会缓冲php的输出。即便是调用了flush方法,相应内容也会被nginx缓冲,而不会输出到浏览器。
2.某些浏览器也会有缓冲,如在接收的数据小于一定值的时候,不会对代码进行渲染。
详细介绍请查看 《从php的缓冲区说起》
以下是一个demo示例代码:
<?php
header("Transfer-Encoding","chunked");
ini_set("output_buffering",0);
?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>php实现BigPipe</title>
<style type="text/css">
<!--
body {
font-size:12px;
text-align:left;
#head {
width:100%;
height:40px;
background:#8CAADE;
font-weight:bold;
color:#FFFFFF;
line-height:40px;
text-align:center;
font-size:16px;
#body {
margin:5px auto 5px auto;
width:800px;
border:solid 1px #8CAADE;
padding:10px;
line-height:30px;
#left {
float:left;
width:50%;
border:0px;
line-height:23px;
#right {
float:right;
width:50%;
border:0px;
line-height:23px;
#result {
width:800px;
height:30px;
text-align:center;
#bottom {
margin-top:5px;
width:800px;
height:30px;
text-align:center;
display:none;
#bottom a {
color:red;
text-decoration:none;
-->
</style>
<script>
function update(id, content) {
document.getElementById(id).innerHTML = content;
</script>
</head>
<?php
ob_flush();
flush();
?>
<body>
<div id="head">php实现BigPipe</div>
<div id="body">
<div>
本demo旨在演示php的并发处理在bigpipe中的应用。因此,在一些细节上实现的比较简单。但是,demo完全体现了bigpipe的并行数据处理和并行加载。

慢动作体现的是后端php串行处理时的效果。
</div>
<div id="cost_time"></div>
<?php
/*
* @purpose: 使用curl并行处理url
* @return: array 每个url获取的数据
* @param: $urls array url列表
* @param: $callback string 需要进行内容处理的回调函数。示例:func(array)
*/
function curl($urls = array(), $callback = '')
$response = array();
if (empty($urls)) {
return $response;
$chs = curl_multi_init();
$map = array();
foreach($urls as $url){
$cookie_file = "/temp/".md5($url).".txt";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, 2);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_NOSIGNAL, true);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);
curl_multi_add_handle($chs, $ch);
$map[strval($ch)] = $url;
do{
if (($status = curl_multi_exec($chs, $active)) != CURLM_CALL_MULTI_PERFORM) {
if ($status != CURLM_OK) { break; } //如果没有准备就绪,就再次调用curl_multi_exec
while ($done = curl_multi_info_read($chs)) {
$info = curl_getinfo($done["handle"]);
$error = curl_error($done["handle"]);
$result = curl_multi_getcontent($done["handle"]);
$url = $map[strval($done["handle"])];
$rtn = compact('info', 'error', 'result', 'url');
if (trim($callback)) {
$callback($rtn);
$response[$url] = $rtn;
curl_multi_remove_handle($chs, $done['handle']);
curl_close($done['handle']);
//如果仍然有未处理完毕的句柄,那么就select
if ($active > 0) {
curl_multi_select($chs, 0.5); //此处会导致阻塞大概0.5秒。
while($active); //还有句柄处理还在进行中
curl_multi_close($chs);
return $response;
//使用方法
function deal($data){
$url_info = parse_url($data["url"]);
$content_id = "content_".md5($data["url"]);
if ($data["error"] == "") {
$content = $url_info["host"]." 能正常打开";
echo "<script>update('$content_id', '$content')</script>";
} else {
$content = $url_info["host"]." 访问失败。具体错误原因:".$data["error"];
echo "<script>update('$content_id', '$content')</script>";
//因为浏览器有缓冲,即获取数据后,不会马上渲染。当获取数据大于一个值时开始渲染。
echo str_repeat(' ',1024);
ob_flush();
flush();
if ($_GET["m"] == "slow") {
sleep(1);
$keyword = "一淘网";
$google_urls = array(
'http://www.google.com.br',//巴西
'http://www.google.ch',//瑞士
'http://www.google.nl',//荷兰
'http://www.google.com.au',//澳大利亚
'http://www.google.co.in',//印度
'http://www.google.ro',//罗马尼亚
'http://www.google.co.th',//泰国
'http://www.google.com.sa',//沙特阿拉伯
'http://www.google.co.jp',//日本
'http://www.google.com.my',//马来西亚
'http://www.google.ca',//加拿大
'http://www.google.com.tw',//中国台湾
);
$google_num = 10;//从google网址中取几个
$keys = array_rand($google_urls,$google_num);
$urls[] = "http://www.baidu.com/s?wd=".urlencode($keyword);
$urls[] = "http://www.etao.com";
for ( $i = 0; $i < $google_num; $i++) {
$urls[] = $google_urls[$keys[$i]]."/search?sclient=psy-ab&hl=en&site=&source=hp&q=".urlencode($keyword);
//生成占位div
foreach($urls as $url){
echo "<div class='item' id='content_".md5($url)."'>{$url} 检测中</div>";
//除了浏览器web服务器可能也会缓冲,如nginx的fastcgi_buffers。
echo str_repeat(' ',1024);
ob_end_flush();
ob_flush();
flush();
//开始获取搜索数据
$start = microtime(true);
curl($urls, "deal");
$cost_time = microtime(true) - $start;
echo "<script>update('cost_time', '耗时{$cost_time}秒 <a href=\'?m=slow\'>查看慢动作</a>')</script>";
?>
</div>
</body>
</html>
演示地址: http://demo.bo56.com/bigpipe/
技术交流原文链接:php实现bigpipe,转载请注明来源!
原文链接:php实现bigpipe,转载请注明来源!
 分享到:
【上一篇】php扩展中如何定义线程安全的全局对象【下一篇】php实现并发处理之curl篇相关推荐* PHP7扩展开发之依赖其他扩展* PHP7扩展开发之使用静态库* PHP7扩展开发之对象方式使用lib库* PHP7扩展开发之函数调用* PHP7扩展开发之配置项4 条评论
蒋建勇 2013 年 8 月 21 日 下午 5:44
你好, 可以分享一下你的nginx配置文件么?
回复
信海龙_ 管理员 2013 年 8 月 21 日 下午 9:21
使用BigPipe时,前端尽量不要使用nginx作为前端web服务器。因为他的fast-cgi的buffer无法关闭。也不要启用gzip等压缩。因此,就不再分享nginx配置文件了。
回复
骑行318 2013 年 11 月 25 日 上午 9:34
不用nginx,那应该用神马?
回复
信海龙_ 管理员 2013 年 11 月 25 日 下午 7:59
在buffer这部分,apache可以有效控制。建议你看看这篇博文 。http://www.bo56.com/%E4%BB%8Ephp%E7%9A%84%E7%BC%93%E5%86%B2%E5%8C%BA%E8%AF%B4%E8%B5%B7/
回复
发表评论 取消回复
电子邮件地址不会被公开。 必填项已用*标注评论 姓名 *
电子邮件 *
站点
搜索
搜索:
关注微博
分类目录
开源分析
思考感悟
操作系统
数据库
算法相关
编程语言
c&c++
Java
PHP
网站架构
规范协议
问题排查
标签云编码
memcache
编码表
缓冲区
utf8编码
tcpdump
accept
性能对比
线程
linux
gbk编码
wireshark
epoll
yac
buffer
core
mysqlnd
c语言
pkg-config
PHP7扩展开发
utf8
编码字库
性能分享
php-fpm
nginx
商战
zend opcache
技术大会分享PPT
市场营销
php并发
php7_ext
内存
mysql
bigpipe
kvproxy
php扩展
编码识别
apc
redis
curl
正则
php
全局变量
gbk
最新评论
素材火 发表在 聊聊服务稳定性保障这些事PPT
谢谢分享,看看学习一下
浩柏 发表在 团队管理杂谈
大佬,很有收获。
刘泽明 发表在 解决crond脚本执行并发冲突问题
"ps aux | grep 'test.php' |grep -v 'grep'| wc -l" proc_num &...
sus 发表在 TSSH
mac 电脑如何安装,不能通过pip 吗 ?
姚树标 发表在 PHP7扩展开发之类型处理
文中提到 strpprintf 第一个参数是最大字符数, 为什么代码中写的...
功能
注册登录
文章RSS
评论RSS
WordPress.org
Copyright © 2015 | 博学无忧 |
京ICP备12049475号-3
HMJ-Blog Theme by 何敏杰