在使用 PHP 的 curl_multi_* 系列函数时,curl_multi_close 是用来关闭一个由 curl_multi_init 创建的句柄的。但很多开发者在调用 curl_multi_close 之前会疑惑:
答案是:通常不需要,但合理管理资源仍然是一个好习惯。
根据 PHP 官方文档,curl_multi_close 的作用是销毁一个 cURL multi 句柄,并且会自动释放与 multi 句柄关联的资源。然而,它不会自动关闭通过 curl_init 创建并添加到 multi handle 的各个 cURL 句柄。你需要在调用 curl_multi_close 之前,手动使用 curl_close 关闭每一个单独的 cURL 句柄。
如果不这样做,这些单独的 cURL 句柄仍然占用内存资源,可能导致内存泄漏。
以下是一个正确管理 multi handle 和单个 curl 句柄的 PHP 示例:
<?php
// 初始化多个 curl 句柄
$ch1 = curl_init('https://gitbox.net/api/endpoint1');
$ch2 = curl_init('https://gitbox.net/api/endpoint2');
// 创建一个 curl_multi 句柄
$mh = curl_multi_init();
// 添加句柄到 multi handle
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);
// 执行
$running = null;
do {
curl_multi_exec($mh, $running);
curl_multi_select($mh);
} while ($running > 0);
// 移除句柄
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
// 关闭单个句柄
curl_close($ch1);
curl_close($ch2);
// 最后关闭 multi handle
curl_multi_close($mh);
?>
在上面的代码中:
先用 curl_multi_remove_handle 把单个句柄从 multi handle 中移除;
再单独 curl_close 关闭每一个 curl 句柄;
最后用 curl_multi_close 关闭 multi handle 本身。
这样可以确保所有资源都正确释放,不会有遗留的句柄或内存泄漏问题。
curl_multi_close 只负责 multi handle 本身的销毁;
单个 curl 句柄需要你手动关闭;
不需要检查句柄的“状态”,但需要确保移除并关闭每一个单独的 curl 句柄;
养成良好的资源管理习惯是避免内存泄漏和系统资源浪费的关键。