PHP curl 并发最佳实践代码分享


在PHP中,使用cURL进行HTTP请求时,若要实现并发(即同时发起多个请求),一种常见且高效的方法是使用`curl_multi_*`函数族。这里,我将提供一个基于`curl_multi_init`和`curl_multi_exec`等函数的示例代码,以展示如何并发地执行多个cURL请求。


<?php

// 初始化多个cURL句柄的批处理句柄
$mh = curl_multi_init();

// 准备多个cURL句柄
$urls = [
    'http://example.com/',
    'http://google.com/',
    'http://bing.com/'
];

$curl_array = [];
foreach ($urls as $key => $url) {
    // 初始化cURL会话
    $ch = curl_init($url);
    // 设置cURL选项
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    // 保存到数组中
    $curl_array[$key] = $ch;
    // 将单个cURL句柄添加到批处理句柄中
    curl_multi_add_handle($mh, $ch);
}

// 执行批处理句柄中的cURL句柄
$running = null;
do {
    // 执行批处理句柄中的所有cURL句柄
    curl_multi_exec($mh, $running);
} while ($running > 0);

// 关闭所有cURL句柄
foreach ($curl_array as $ch) {
    // 检查是否有错误发生
    if (curl_errno($ch)) {
        echo 'Curl error: ' . curl_error($ch);
    }
    // 获取内容
    $result = curl_multi_getcontent($ch);
    // 打印结果(实际使用时可能需要进一步处理)
    echo $result . "\n";
    // 移除cURL句柄
    curl_multi_remove_handle($mh, $ch);
    // 关闭cURL句柄
    curl_close($ch);
}

// 关闭批处理句柄
curl_multi_close($mh);

?>

这段代码首先初始化了一个cURL多句柄`$mh`,然后针对每个URL创建了一个cURL句柄,并将它们添加到多句柄`$mh`中。之后,使用`curl_multi_exec`函数循环执行这些句柄,直到所有句柄都执行完毕。最后,代码遍历每个cURL句柄,获取其内容,并在处理完毕后将其从多句柄中移除并关闭。整个过程中,所有的cURL请求都是并发执行的,这可以显著提高处理多个HTTP请求的效率。