如何将常规CURL请求转换为Multi CURL请求?附现有代码
转换为Multi CURL的实现方案
没问题!我帮你把这段循环执行的单CURL请求改成Multi CURL版本,这样能并行处理所有请求,相比逐个执行的方式,效率会提升很多。
下面是完整的实现代码,我会在代码后解释关键改动点:
// 初始化Multi CURL批处理句柄 $mh = curl_multi_init(); $curlHandles = []; // 循环创建单个CURL句柄并添加到批处理中 for ($i = 0; $i < 300; $i++) { // 跳过数组越界的情况(确保$numbers_from和$messages有足够元素) if (!isset($numbers_from[$i]['number_from'], $messages[$i]['message_content'])) { continue; } // 创建单个CURL句柄 $ch = curl_init(); // 设置通用的CURL选项 curl_setopt($ch, CURLOPT_URL, "websiteURL"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($ch, CURLOPT_HEADER, FALSE); curl_setopt($ch, CURLOPT_POST, TRUE); // 注意去掉Content-Type前面的空格,避免HTTP头解析问题 curl_setopt($ch, CURLOPT_HTTPHEADER, [ "Content-Type: application/json", 'Authorization: Basic ' . base64_encode("XXXXX:YYYYYY") ]); // 设置当前请求的POST数据(这里假设$messages[$i]里的字段是message_content,你可以根据实际调整) $postData = json_encode([ "src" => $numbers_from[$i]['number_from'], "dst" => $messages[$i]['message_content'] // 补充你原来代码里省略的其他字段 ]); curl_setopt($ch, CURLOPT_POSTFIELDS, $postData); // 将句柄添加到批处理中 curl_multi_add_handle($mh, $ch); // 保存句柄到数组,后续用于获取结果 $curlHandles[] = $ch; } // 执行Multi CURL请求 $running = null; do { curl_multi_exec($mh, $running); curl_multi_select($mh); // 等待请求完成,避免CPU空转 } while ($running > 0); // 处理每个请求的返回结果 $results = []; foreach ($curlHandles as $ch) { // 获取请求结果 $response = curl_multi_getcontent($ch); // 可以在这里解析JSON结果 $results[] = json_decode($response, true); // 检查是否有错误 if (curl_errno($ch)) { $error = curl_error($ch); // 处理错误逻辑,比如记录日志 error_log("CURL请求错误: " . $error); } // 关闭单个CURL句柄 curl_multi_remove_handle($mh, $ch); curl_close($ch); } // 关闭Multi CURL批处理句柄 curl_multi_close($mh); // 现在$results里保存了所有请求的返回结果 print_r($results);
关键改动说明:
- Multi CURL核心结构:用
curl_multi_init()创建批处理句柄,通过curl_multi_add_handle()把单个请求句柄加入批处理,最后用curl_multi_exec()并行执行所有请求。 - 避免CPU空转:加入
curl_multi_select(),让程序在请求未完成时进入等待状态,不会占用过多CPU资源。 - 结果处理:循环通过
curl_multi_getcontent()获取每个请求的返回值,同时处理可能的请求错误。 - 细节优化:去掉了HTTP头里
Content-Type前面的多余空格,避免服务器解析头信息时出错;增加了数组索引检查,防止越界报错。
内容的提问来源于stack exchange,提问作者user9544660
相关产品推荐
相关产品推荐

