下面是关于“PHP使用curl_multi实现并发请求的方法示例”的攻略:
什么是curl_multi?
curl_multi可以让我们一次性发送多个curl请求,并发获取结果。相对于使用串行方法来发送请求,在一些请求频繁的应用场景下,我们可以大大提升程序性能。
curl_multi的使用
使用curl_multi的流程包括两个步骤:初始化curl_multi并添加要请求的URL,然后开始执行多个curl请求。
初始化curl_multi并添加要请求的URL
创建一个curl_multi句柄,并使用curl_multi_add_handle()方法添加要请求的URL,代码如下:
$mh = curl_multi_init();
$handles = array();
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
array_push($handles, $ch);
curl_multi_add_handle($mh, $ch);
}
其中,$urls为我们要请求的多个URL地址,我们使用foreach循环依一一创建curl句柄。
开始执行多个curl请求
我们可以使用curl_multi_exec()方法来执行多个curl请求,如下所示:
do {
$status = curl_multi_exec($mh, $active);
if ($active) {
if (curl_multi_select($mh) === -1) {
usleep(100);
}
}
} while ($active && $status === CURLM_OK);
$results = array();
foreach ($handles as $ch) {
$results[] = curl_multi_getcontent($ch);
curl_multi_remove_handle($mh, $ch);
}
curl_multi_close($mh);
do-while循环会一直执行curl_multi_exec()方法,直到所有请求都已经返回。而curl_multi_select()方法则用于防止curl一直占用CPU,可以让自旋等待的时间避免过度浪费CPU资源。
最后一段代码从每个句柄中获取内容,移除句柄,并关闭curl_multi。
示例代码
下面我们介绍两个示例,帮助您更好的理解使用curl_multi实现并发请求的方法。
示例一
我们可以使用curl_multi下载多个图片,如下代码所示:
$urls = [
'https://example.com/image1.jpg',
'https://example.com/image2.jpg',
'https://example.com/image3.jpg',
];
$mh = curl_multi_init();
$handles = array();
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
array_push($handles, $ch);
curl_multi_add_handle($mh, $ch);
}
do {
$status = curl_multi_exec($mh, $active);
if ($active) {
if (curl_multi_select($mh) === -1) {
usleep(100);
}
}
} while ($active && $status === CURLM_OK);
$results = array();
foreach ($handles as $ch) {
$results[] = curl_multi_getcontent($ch);
curl_multi_remove_handle($mh, $ch);
}
curl_multi_close($mh);
foreach ($results as $result) {
file_put_contents('./download/'.md5($result).'.jpg', $result);
}
该代码会下载多个图片,并把图片保存在./download/下。
示例二
在本示例中,我们将使用curl_multi同时向多个URL发送POST请求,如下代码所示:
$urls = [
'https://example.com/api/user',
'https://example.com/api/login',
'https://example.com/api/profile',
];
$postData = [
'user' => 'example',
'pass' => '123456',
];
$mh = curl_multi_init();
$handles = array();
foreach ($urls as $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
array_push($handles, $ch);
curl_multi_add_handle($mh, $ch);
}
do {
$status = curl_multi_exec($mh, $active);
if ($active) {
if (curl_multi_select($mh) === -1) {
usleep(100);
}
}
} while ($active && $status === CURLM_OK);
$results = array();
foreach ($handles as $ch) {
$results[] = curl_multi_getcontent($ch);
curl_multi_remove_handle($mh, $ch);
}
curl_multi_close($mh);
foreach ($results as $result) {
var_dump(json_decode($result, true));
}
该代码会向多个URL发送POST请求,并使用json_decode方法处理返回的结果,并打印到屏幕上。
希望以上介绍对您有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP使用curl_multi实现并发请求的方法示例 - Python技术站