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));
正文完
有偿技术支持加微信