如何在PHP的curl_multi_exec执行过程中识别当前运行的CURL句柄?
如何在curl_multi_exec中识别对应的CURL句柄?
当然可以实现!虽然curl_multi没有直接提供「获取当前正在执行句柄」的API,但我们可以通过给句柄绑定自定义标识+读取完成请求的信息来精准追踪每个请求。下面是具体的实现方案:
1. 给每个CURL句柄绑定唯一标识
在创建每个CURL句柄后,用curl_setopt的CURLOPT_PRIVATE选项给它绑定一个自定义的ID、名称或者任何你需要的标识,这样后续就能通过这个标识区分不同的请求:
// 示例:给每个句柄绑定唯一ID $ch1 = curl_init('https://example.com/1'); curl_setopt($ch1, CURLOPT_PRIVATE, 'request_1'); // 自定义标识 curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true); $ch2 = curl_init('https://example.com/2'); curl_setopt($ch2, CURLOPT_PRIVATE, 'request_2'); curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true); // 其他ch3/ch4/ch5同理设置
2. 在循环中追踪完成的请求
在curl_multi_exec的执行循环里,用curl_multi_info_read()函数获取已经完成的请求信息——这个函数会返回包含对应句柄的数组,我们再通过curl_getinfo($ch, CURLINFO_PRIVATE)取出之前绑定的标识,就能知道是哪个请求完成了:
$mh = curl_multi_init(); curl_multi_add_handle($mh, $ch1); curl_multi_add_handle($mh, $ch2); // 添加其他句柄... do { $mrc = curl_multi_exec($mh, $active); // 检查是否有已完成的请求 while ($info = curl_multi_info_read($mh)) { $completedCh = $info['handle']; // 取出绑定的自定义标识 $requestId = curl_getinfo($completedCh, CURLINFO_PRIVATE); // 这里可以做任何你需要的区分处理 echo "请求【{$requestId}】已完成,HTTP状态码:" . curl_getinfo($completedCh, CURLINFO_HTTP_CODE) . "\n"; $responseContent = curl_multi_getcontent($completedCh); // 处理完记得清理句柄 curl_multi_remove_handle($mh, $completedCh); curl_close($completedCh); } } while ($mrc == CURLM_CALL_MULTI_PERFORM); while ($active && $mrc == CURLM_OK) { if (curl_multi_select($mh) == -1) { usleep(100); // 避免CPU空转 } do { $mrc = curl_multi_exec($mh, $active); // 再次检查完成的请求 while ($info = curl_multi_info_read($mh)) { $completedCh = $info['handle']; $requestId = curl_getinfo($completedCh, CURLINFO_PRIVATE); echo "请求【{$requestId}】已完成,HTTP状态码:" . curl_getinfo($completedCh, CURLINFO_HTTP_CODE) . "\n"; $responseContent = curl_multi_getcontent($completedCh); curl_multi_remove_handle($mh, $completedCh); curl_close($completedCh); } } while ($mrc == CURLM_CALL_MULTI_PERFORM); } curl_multi_close($mh);
补充说明
为什么没法直接获取「正在执行」的句柄?因为curl_multi是基于底层并发机制处理请求的,多个请求是同时进行的,没有暴露直接的API来返回当前正在运行的句柄。但通过上面的方法,我们可以实时追踪每个完成的请求,完全满足区分不同句柄的需求。
内容的提问来源于stack exchange,提问作者rsSpeaks
相关产品推荐
相关产品推荐

