在使用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 句柄;
養成良好的資源管理習慣是避免內存洩漏和系統資源浪費的關鍵。