注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

@fc_lamp

关注Web应用解决方案MySql/PHP/Python一盏名为"飞川"的灯~

 
 
 

日志

 
 

cURL: PHP并发最佳实践  

2013-11-08 16:45:56|  分类: Web技术-Php |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
一 方式一CURL
1 经典的curl_multi_init 使用:
 

<?php
/**
*
* 经典的curl_multi_init使用方式
*/
function class_multicurl($urls)
{
$mh = curl_multi_init ();
$maps = array ();

//添加进队列
foreach ( $urls as $url )
{
$ch = curl_init ();

curl_setopt ( $ch, CURLOPT_URL, $url );
curl_setopt ( $ch, CURLOPT_HEADER, 0 ); //不使用头文件的信息
curl_setopt ( $ch, CURLOPT_TIMEOUT, 1 );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 ); //返回body,不直接输出

curl_multi_add_handle ( $mh, $ch );
$maps [$url] = $ch;
}

//执行
$running = NULL;
do
{
$mrc = curl_multi_exec ( $mh, $running ); //运行cURL 句柄的子连接
} while ( $mrc == CURLM_CALL_MULTI_PERFORM ); //发送完所有请求的URL


//操作是否仍在执行(前提是:批处理正常 CURLM_OK )

while ( $running and $mrc == CURLM_OK )
{
//是否还活动的连接
if (curl_multi_select ( $mh, 0.5 ) != - 1)
{
do
{
$mrc = curl_multi_exec ( $mh, $running ); //运行cURL 句柄的子连接
} while ( $mrc == CURLM_CALL_MULTI_PERFORM );

}
}

//获取内容
foreach ( $maps as $url => $ch )
{
print curl_multi_getcontent ( $ch );

curl_multi_remove_handle ( $mh, $ch );
curl_close ( $ch );
}

//关闭
curl_multi_close ( $mh );
}

$urls = array ('http://www.baidu.com', 'http://www.google.com.hk/', 'http://www.oschina.net/' );
class_multicurl ( $urls );


2 改进

<?php
/**
*
* 改进curl_multi_init使用方式
*/
function new_multicurl($urls)
{
$mh = curl_multi_init ();
$maps = array ();

//添加进队列
foreach ( $urls as $url )
{
$ch = curl_init ();

curl_setopt ( $ch, CURLOPT_URL, $url );
curl_setopt ( $ch, CURLOPT_HEADER, 0 ); //不使用头文件的信息
curl_setopt ( $ch, CURLOPT_TIMEOUT, 1 );
curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 ); //返回body,不直接输出


curl_multi_add_handle ( $mh, $ch );
$maps [$url] = $ch;
}

//执行
$running = NULL;
do
{
$mrc = curl_multi_exec ( $mh, $running ); //运行cURL 句柄的子连接
if ($mrc != CURLM_OK) //如果批处理有错
{
break;
}

//查询批处理句柄是否单独的传输线程中有消息或信息返回
while ( $done = curl_multi_info_read ( $mh ) )
{
$info = curl_getinfo ( $done ['handle'] );
var_dump($info).'<p>bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb<p>';
$error = curl_error ( $done ['handle'] );
$results = curl_multi_getcontent ( $done ['handle'] );

curl_multi_remove_handle ( $mh, $done ['handle'] );
curl_close ( $done ['handle'] );
}

//阻塞直到cURL批处理连接中有活动连接
if ($running > 0)
{
curl_multi_select ( $mh, 0.5 );
}

} while ($running > 0); //直到所有都完成


//关闭
curl_multi_close ( $mh );
}

$urls = array ('http://www.baidu.com', 'http://www.google.com.hk/', 'http://www.oschina.net/' );

new_multicurl($urls);

参:http://www.searchtb.com/2012/06/rolling-curl-best-practices.html


二 方式二 使用pecl_http 扩展的HttpRequestPool

$endpoint = "http://api.someservice.com";
$userId = 101;

$urls = array(
$endpoint . '/profile/' . $userId,
$endpoint . '/orderHistory/' . $userId,
$endpoint . '/currentBalance/' . $userId
);

$pool = new HttpRequestPool;

foreach ($urls as $url) {
$req = new HttpRequest($url, HTTP_METH_GET);
$pool->attach($req);
}

// send all the requests. control is back to the script once
// all the requests are complete or timed out
$pool->send();

foreach ($pool as $request) {
echo $request->getUrl(), PHP_EOL;
echo $request->getResponseBody(), PHP_EOL . PHP_EOL;
}

参考:http://emranhasan.com/2013/09/concurrent-requests-in-php-using-pecl_http/




  评论这张
 
阅读(536)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017