这个范例将会创建2个cURL句柄,把它们加到批处理句柄,然后并行地运行它们。
<?php
// 创建一对cURL资源
$ch1 = curl_init();
$ch2 = curl_init();
// 设置URL和相应的选项
curl_setopt($ch1, CURLOPT_URL, "http://www.example.com/");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "http://www.php.net/");
curl_setopt($ch2, CURLOPT_HEADER, 0);
// 创建批处理cURL句柄
$mh = curl_multi_init();
// 增加2个句柄
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);
$running=null;
// 执行批处理句柄
do {
usleep(10000);
curl_multi_exec($mh,$running);
} while ($running > 0);
// 关闭全部句柄
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);
?>
封装curl_multi让请求与业务逻辑并行执行
前言
curl_multi
创建一个批处理,将多个curl
句柄加入其中,然后执行这个批处理curl_multi_exec()
执行批处理中需要操作的句柄。- 如
发送请求
/接收处理响应
,等待响应时则无需操作
- 如
curl_multi_select()
阻塞等待,直到有待处理的句柄
/超时
。- 如某个句柄接收到了响应。
- 此函数可以避免等待期的死循环空转 exec 情况。线程应该是挂起状态,由底层触发唤醒。
分析
- 优化核心在于
curl_multi_exec()
和curl_multi_select()
- 通过调试发现执行
curl_multi_exec()
第一次即为发送 HTTP 请求报文,推测 exec 的执行粒度为 HTTP 请求 / 响应报文的处理。 - 所以我们可以先发送请求,然后执行自己的业务逻辑,最后需要时再获取执行结果。这样就可以复用等待响应的时间。
- 因为
重定向
/HTTPS
都会涉及到多次HTTP报文
交互,封装中尽量为其提供了可选优化参数。