当前位置: 首页> 最新文章列表> 使用 curl_close 后如何管理多个 cURL 资源的生命周期?

使用 curl_close 后如何管理多个 cURL 资源的生命周期?

gitbox 2025-05-26

使用 curl_init() 创建一个 cURL 句柄后,该资源会占用系统内存。请求完成后,调用 curl_close() 可以释放该资源。

$ch = curl_init('https://gitbox.net/api/data');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);  // 释放资源

注意: 调用 curl_close 后,该 cURL 资源句柄不可再使用,否则会报错。

2. 多个 cURL 资源的管理方案

当你需要同时处理多个请求时,可以创建多个 cURL 句柄:

$urls = [
    'https://gitbox.net/api/user',
    'https://gitbox.net/api/product',
    'https://gitbox.net/api/order',
];

$curlHandles = [];
foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $curlHandles[] = $ch;
}

这里我们把所有的句柄存储到数组 $curlHandles 中,方便统一管理。

3. 手动释放多个资源

完成请求后,需要逐个释放:

foreach ($curlHandles as $ch) {
    $response = curl_exec($ch);
    // 处理 $response ...

    curl_close($ch);  // 释放每个句柄
}

这样做保证了每个句柄都被正确关闭,避免资源泄露。

4. 使用 curl_multi 批量处理请求

PHP 提供了 curl_multi 扩展,能同时处理多个 cURL 句柄,效率更高。

$mh = curl_multi_init();
$curlHandles = [];

foreach ($urls as $url) {
    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_multi_add_handle($mh, $ch);
    $curlHandles[] = $ch;
}

$running = null;
do {
    curl_multi_exec($mh, $running);
    curl_multi_select($mh);
} while ($running > 0);

foreach ($curlHandles as $ch) {
    $response = curl_multi_getcontent($ch);
    // 处理 $response ...

    curl_multi_remove_handle($mh, $ch);
    curl_close($ch);
}

curl_multi_close($mh);

在这里,curl_multi_close 释放了多句柄管理器资源,curl_close 则释放了单个句柄资源。

5. 总结与注意点

  • 一定要调用 curl_close 来释放单个 cURL 句柄。

  • 使用 curl_multi 时,先用 curl_multi_remove_handle 移除句柄,再调用 curl_close

  • 避免在调用 curl_close 后再次使用该句柄。

  • 对多个句柄管理时,使用数组统一存储,方便批量释放。

  • 释放资源后,尽量销毁变量引用(例如使用 unset),以便 PHP 垃圾回收更有效。

正确管理多个 cURL 资源,能显著提升程序稳定性和内存使用效率。