php利用curl的curl_multi_init实现并发请求

418次阅读
没有评论

curl_multi_init 官方文档地址 https://www.php.net/manual/zh/function.curl-multi-init.php

demo 详细说明见原文
https://segmentfault.com/a/1190000016343861

<?php

// 简单 demo,默认支持为 GET 请求
 function multiRequest($urls) {$mh = curl_multi_init();
     $urlHandlers = [];
     $urlData = [];
     // 初始化多个请求句柄为一个
     foreach($urls as $value) {$ch = curl_init();
          $url = $value['url'];
          $url .= strpos($url, '?') ? '&' : '?';
          $params = $value['params'];
          $url .= is_array($params) ? http_build_query($params) : $params;
          curl_setopt($ch, CURLOPT_URL, $url);
          // 设置数据通过字符串返回,而不是直接输出
          curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
          $urlHandlers[] = $ch;
          curl_multi_add_handle($mh, $ch);
     }
 
    $active = null;
    // 检测操作的初始状态是否 OK,CURLM_CALL_MULTI_PERFORM 为常量值 -1
    do {
       // 返回的 $active 是活跃连接的数量,$mrc 是返回值,正常为 0,异常为 -1
       $mrc = curl_multi_exec($mh, $active);
    } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    // 如果还有活动的请求,同时操作状态 OK,CURLM_OK 为常量值 0
    while ($active && $mrc == CURLM_OK) {
       // 持续查询状态并不利于处理任务,每 50ms 检查一次,此时释放 CPU,降低机器负载
       usleep(50000);
       // 如果批处理句柄 OK,重复检查操作状态直至 OK。select 返回值异常时为 -1,正常为 1(因为只有 1 个批处理句柄)if (curl_multi_select($mh) != -1) {
          do {$mrc = curl_multi_exec($mh, $active);
          } while ($mrc == CURLM_CALL_MULTI_PERFORM);
       }
    }
 
    // 获取返回结果
    foreach($urlHandlers as $index => $ch) {$urlData[$index] = curl_multi_getcontent($ch);
         // 移除单个 curl 句柄
         curl_multi_remove_handle($mh, $ch);
    }
    
     curl_multi_close($mh);
     return $urlData;
 }

$data = [[ 'url'=>'http://www.jone.xyz/',     'params'=>[] ],
     ['url'=>'http://www.jone.xyz/about',  'params'=>[] ]
];


var_dump(multiRequest($data));
正文完
有偿技术支持加微信
post-qrcode
 0
评论(没有评论)
验证码