當前位置: 首頁> 最新文章列表> curl_multi_close 執行時是否需要檢查所有句柄的狀態?

curl_multi_close 執行時是否需要檢查所有句柄的狀態?

gitbox 2025-05-12

在使用PHP 的curl_multi_*系列函數時, curl_multi_close是用來關閉一個由curl_multi_init創建的句柄的。但很多開發者在調用curl_multi_close之前會疑惑:

答案是:通常不需要,但合理管理資源仍然是一個好習慣。

理解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);
?>

在上面的代碼中:

  1. 先用curl_multi_remove_handle把單個句柄從multi handle 中移除;

  2. 再單獨curl_close關閉每一個curl 句柄;

  3. 最後用curl_multi_close關閉multi handle 本身。

這樣可以確保所有資源都正確釋放,不會有遺留的句柄或內存洩漏問題。

小結

  • curl_multi_close只負責multi handle 本身的銷毀;

  • 單個curl 句柄需要你手動關閉;

  • 不需要檢查句柄的“狀態”,但需要確保移除並關閉每一個單獨的curl 句柄

  • 養成良好的資源管理習慣是避免內存洩漏和系統資源浪費的關鍵。