You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:20:59