如何使用curl发送仅URL不同的两个请求 复用头参数避免重复代码
方案1:串行复用curl句柄(低请求量场景首选)
仅初始化一次curl、配置一次公共参数,遍历URL时仅修改CURLOPT_URL即可,无冗余代码:
// 统一管理所有目标域名 $urls = [ "www.example1.com", "www.example2.com" ]; $curl = curl_init(); // 公共配置仅设置一次 curl_setopt_array($curl, array( CURLOPT_POST => TRUE, CURLOPT_RETURNTRANSFER => TRUE, CURLOPT_POSTFIELDS => json_encode($body), CURLOPT_HTTPHEADER => $headers, )); $responses = []; foreach ($urls as $key => $baseUrl) { // 仅更新请求URL,其余配置复用 curl_setopt($curl, CURLOPT_URL, $baseUrl . '/api/v1/orders'); $responses[$key] = curl_exec($curl); // 可选错误处理 if (curl_errno($curl)) { $responses[$key] = ['error' => curl_error($curl)]; } } curl_close($curl); // 使用示例:$responses[0] 对应url1的返回结果,$responses[1]对应url2的返回结果
方案2:并行请求(高效场景可选)
如果想要减少总请求耗时,可以用curl_multi实现同时发送两个请求,无需等待前一个请求返回再发下一个:
$urls = [ "www.example1.com/api/v1/orders", "www.example2.com/api/v1/orders" ]; $mh = curl_multi_init(); $handles = []; foreach ($urls as $i => $fullUrl) { $handles[$i] = curl_init($fullUrl); // 公共配置批量应用到每个句柄 curl_setopt_array($handles[$i], [ CURLOPT_POST => TRUE, CURLOPT_RETURNTRANSFER => TRUE, CURLOPT_POSTFIELDS => json_encode($body), CURLOPT_HTTPHEADER => $headers, ]); curl_multi_add_handle($mh, $handles[$i]); } // 执行并行请求 do { $status = curl_multi_exec($mh, $active); if ($active) { curl_multi_select($mh); } } while ($active && $status == CURLM_OK); // 收集所有响应结果 $responses = []; foreach ($handles as $i => $ch) { $responses[$i] = curl_multi_getcontent($ch); curl_multi_remove_handle($mh, $ch); curl_close($ch); } curl_multi_close($mh);
内容的提问来源于stack exchange,提问作者치노장인
相关产品推荐
相关产品推荐

