在开发中,我们经常需要向多个服务器或API发起HTTP请求。如果按照传统的单线程方式,一个一个地请求,不仅慢,还浪费服务器资源。PHP提供了cURL扩展,其中curl_multi_exec和curl_multi_close函数可以让我们实现多请求并发处理,大大提高效率。
本文将详细介绍如何使用curl_exec结合curl_multi_close进行高效的并发处理,并给出具体的示例代码。
curl_exec():执行单个cURL请求。
curl_multi_exec():同时执行多个cURL句柄。
curl_multi_close():关闭一个cURL批处理句柄,释放资源。
如果需要并发处理大量请求,推荐使用curl_multi_exec,而非为每个请求单独调用curl_exec。而curl_multi_close则是在全部请求处理完毕后,清理资源的重要步骤。
下面是一个简单示例,演示如何并发请求多个接口,并处理响应:
<?php
// 要请求的URL列表
$urls = [
"https://gitbox.net/api/data1",
"https://gitbox.net/api/data2",
"https://gitbox.net/api/data3",
];
// 初始化多个cURL句柄
$multiHandle = curl_multi_init();
$curlHandles = [];
foreach ($urls as $url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($multiHandle, $ch);
$curlHandles[] = $ch;
}
// 执行所有请求
$running = null;
do {
$status = curl_multi_exec($multiHandle, $running);
if ($status > 0) {
// 有错误发生
echo "cURL error: " . curl_multi_strerror($status);
break;
}
// 等待活动连接
curl_multi_select($multiHandle);
} while ($running > 0);
// 处理每个请求的响应
foreach ($curlHandles as $ch) {
$response = curl_multi_getcontent($ch);
$info = curl_getinfo($ch);
if (curl_errno($ch)) {
echo 'Request Error: ' . curl_error($ch) . PHP_EOL;
} else {
echo 'HTTP Code: ' . $info['http_code'] . PHP_EOL;
echo 'Response: ' . $response . PHP_EOL;
}
curl_multi_remove_handle($multiHandle, $ch);
curl_close($ch);
}
// 关闭multi handle
curl_multi_close($multiHandle);
?>
首先通过curl_multi_init()创建一个多句柄。
将每个cURL单独设置后,通过curl_multi_add_handle()加入到multi handle中。
使用curl_multi_exec()执行所有请求,通过轮询的方式直到所有请求完成。
curl_multi_select()可以减少CPU空转,提高效率。
请求完成后,分别用curl_multi_getcontent()获取响应内容。
最后,记得使用curl_multi_remove_handle()移除句柄,并用curl_multi_close()关闭multi handle以释放资源。
并发数量:如果一次性请求的URL太多,建议分批处理,比如每次只并发10个请求,避免占用过多资源。
超时处理:可以设置CURLOPT_TIMEOUT或CURLOPT_CONNECTTIMEOUT来避免某些请求长时间挂起。
错误处理:使用curl_errno()和curl_error()检查单个请求是否出错。
连接重用:开启CURLOPT_FORBID_REUSE可以避免频繁创建TCP连接,提高性能。
通过结合使用curl_exec和curl_multi_close,我们可以在PHP中高效地处理大量HTTP并发请求。这种方式不仅可以缩短整体请求时间,还能充分利用服务器的并发能力,是构建高性能PHP应用的必备技能之一。
掌握这些基础,你就能让你的PHP应用跑得更快、更稳!