當前位置: 首頁> 最新文章列表> PHP 中如何使用curl_close 釋放多個cURL 資源?

PHP 中如何使用curl_close 釋放多個cURL 資源?

gitbox 2025-05-18

當你需要並發執行多個cURL 請求時,可以使用curl_multi_exec()函數。這個函數允許同時運行多個cURL 會話,並且通過一個多句柄來管理它們。

以下是一個基本的示例,展示瞭如何使用curl_multi_exec()來處理多個cURL 請求:

 <?php
// 創建多個 cURL 句柄
$ch1 = curl_init("https://gitbox.net/api/data1");
$ch2 = curl_init("https://gitbox.net/api/data2");
$ch3 = curl_init("https://gitbox.net/api/data3");

// 創建一個 cURL 多句柄
$multi_handle = curl_multi_init();

// 將單個 cURL 句柄加入到多句柄中
curl_multi_add_handle($multi_handle, $ch1);
curl_multi_add_handle($multi_handle, $ch2);
curl_multi_add_handle($multi_handle, $ch3);

// 執行多個 cURL 請求
$running = null;
do {
    curl_multi_exec($multi_handle, $running);
} while ($running > 0);

// 關閉每個單獨的 cURL 句柄
curl_multi_remove_handle($multi_handle, $ch1);
curl_multi_remove_handle($multi_handle, $ch2);
curl_multi_remove_handle($multi_handle, $ch3);

// 關閉多句柄
curl_multi_close($multi_handle);

在這個例子中,我們創建了三個cURL 請求句柄,並通過curl_multi_exec()同時執行它們。注意,雖然curl_multi_exec()能同時執行多個請求,但我們仍然需要使用curl_multi_remove_handle()curl_multi_close()來確保正確地釋放資源。

2. 正確使用curl_close 釋放資源

每次執行完cURL 請求後,都應該使用curl_close()函數釋放相應的資源。儘管curl_multi_close()會關閉整個多句柄的連接,但它不會自動關閉單獨的cURL 句柄。因此,在完成多任務操作之後,我們必須手動關閉每個cURL 句柄。若沒有正確釋放這些資源,可能會導致內存洩漏。

下面是改進後的代碼,它正確地使用curl_close()來釋放每個cURL 句柄的資源:

 <?php
// 創建多個 cURL 句柄
$ch1 = curl_init("https://gitbox.net/api/data1");
$ch2 = curl_init("https://gitbox.net/api/data2");
$ch3 = curl_init("https://gitbox.net/api/data3");

// 創建一個 cURL 多句柄
$multi_handle = curl_multi_init();

// 將單個 cURL 句柄加入到多句柄中
curl_multi_add_handle($multi_handle, $ch1);
curl_multi_add_handle($multi_handle, $ch2);
curl_multi_add_handle($multi_handle, $ch3);

// 執行多個 cURL 請求
$running = null;
do {
    curl_multi_exec($multi_handle, $running);
} while ($running > 0);

// 關閉每個單獨的 cURL 句柄
curl_close($ch1);
curl_close($ch2);
curl_close($ch3);

// 關閉多句柄
curl_multi_close($multi_handle);

通過這種方式,我們確保了每個cURL 請求結束後,相關的資源都能被及時釋放。

3. 避免內存洩漏的最佳實踐

  1. 及時釋放資源:在所有cURL 請求完成後,務必調用curl_close()來釋放每個單獨的cURL 資源,並在最後關閉多句柄。

  2. 適當的錯誤處理:在實際項目中,網絡請求可能會失敗,導致一些cURL 句柄沒有被正確關閉。可以通過添加錯誤處理機制來確保無論請求成功與否,資源都能夠被釋放。例如:

     if ($ch1) {
        // 如果請求成功,關閉 cURL 資源
        curl_close($ch1);
    }
    
  3. 監控內存使用情況:在處理多個並發cURL 請求時,可以通過監控PHP 的內存使用情況,確保不會發生內存洩漏。在一些複雜的應用中,適時地使用gc_collect_cycles()來強制回收PHP 的內存垃圾,也能幫助減少內存佔用。

  4. 限制並發請求的數量:儘管curl_multi_exec()可以同時執行多個請求,但過多的並發請求可能會導致系統資源的過度佔用。在實際應用中,可以通過適當限制並發請求的數量,避免過多的cURL 請求佔用過多內存。