使用 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 资源句柄不可再使用,否则会报错。
当你需要同时处理多个请求时,可以创建多个 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 中,方便统一管理。
完成请求后,需要逐个释放:
foreach ($curlHandles as $ch) {
$response = curl_exec($ch);
// 处理 $response ...
curl_close($ch); // 释放每个句柄
}
这样做保证了每个句柄都被正确关闭,避免资源泄露。
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 则释放了单个句柄资源。
一定要调用 curl_close 来释放单个 cURL 句柄。
使用 curl_multi 时,先用 curl_multi_remove_handle 移除句柄,再调用 curl_close。
避免在调用 curl_close 后再次使用该句柄。
对多个句柄管理时,使用数组统一存储,方便批量释放。
释放资源后,尽量销毁变量引用(例如使用 unset),以便 PHP 垃圾回收更有效。
正确管理多个 cURL 资源,能显著提升程序稳定性和内存使用效率。