php 如何模拟并发请求,如何在PHP中使用curl_multi实现一个并发请求

如何在PHP中使用curl_multi实现一个并发请求

发布时间:2021-02-07 21:37:24

来源:亿速云

阅读:83

作者:Leah

这期内容当中小编将会给大家带来有关如何在PHP中使用curl_multi实现一个并发请求,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

具体如下:class CurlMultiUtil {

/**

* 根据url,postData获取curl请求对象,这个比较简单,可以看官方文档

*/

private static function getCurlObject($url,$postData=array(),$header=array()){

$options = array();

$url = trim($url);

$options[CURLOPT_URL] = $url;

$options[CURLOPT_TIMEOUT] = 3;

$options[CURLOPT_RETURNTRANSFER] = true;

foreach($header as $key=>$value){

$options[$key] =$value;

}

if(!empty($postData) && is_array($postData)){

$options[CURLOPT_POST] = true;

$options[CURLOPT_POSTFIELDS] = http_build_query($postData);

}

if(stripos($url,'https') === 0){

$options[CURLOPT_SSL_VERIFYPEER] = false;

}

$ch = curl_init();

curl_setopt_array($ch,$options);

return $ch;

}

/**

* [request description]

* @param [type] $chList

* @return [type]

*/

private static function request($chList){

$downloader = curl_multi_init();

// 将三个待请求对象放入下载器中

foreach ($chList as $ch){

curl_multi_add_handle($downloader,$ch);

}

$res = array();

// 轮询

do {

while (($execrun = curl_multi_exec($downloader, $running)) == CURLM_CALL_MULTI_PERFORM);

if ($execrun != CURLM_OK) {

break;

}

// 一旦有一个请求完成,找出来,处理,因为curl底层是select,所以最大受限于1024

while ($done = curl_multi_info_read($downloader)){

// 从请求中获取信息、内容、错误

// $info = curl_getinfo($done['handle']);

$output = curl_multi_getcontent($done['handle']);

// $error = curl_error($done['handle']);

$res[] = $output;

// 把请求已经完成了得 curl handle 删除

curl_multi_remove_handle($downloader, $done['handle']);

}

// 当没有数据的时候进行堵塞,把 CPU 使用权交出来,避免上面 do 死循环空跑数据导致 CPU 100%

if ($running) {

$rel = curl_multi_select($downloader, 1);

if($rel == -1){

usleep(1000);

}

}

if($running == false){

break;

}

}while(true);

curl_multi_close($downloader);

return $res;

}

/**

* [get description]

* @param [type] $urlArr

* @return [type]

*/

public static function get($urlArr){

$data = array();

if (!empty($urlArr)) {

$chList = array();

foreach ($urlArr as $key => $url) {

$chList[] = self::getCurlObject($url);

}

$data = self::request($chList);

}

return $data;

}

}

上述就是小编为大家分享的如何在PHP中使用curl_multi实现一个并发请求了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注亿速云行业资讯频道。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值