現在の位置: ホーム> 最新記事一覧> curl_multi_closeを使用してリソースの漏れを防ぐ方法

curl_multi_closeを使用してリソースの漏れを防ぐ方法

gitbox 2025-05-12

高い並行性と非同期処理シナリオでは、PHPのcurl_multiシリーズ関数が非常に一般的に使用されています。ただし、多くの開発者は、使用中のリソースリリースの問題を無視し、メモリリークまたはファイルハンドルリークをもたらし、システムの安定性の問題を引き起こします。この記事では、 curl_multi_close関数を介してPHPのリソースリークを正しく防ぐ方法について詳しく説明します。

PHPでは、 curl_multi_*一連の関数を使用すると、複数のCurlセッションを同時に処理することができ、ネットワークリクエストの効率を大幅に改善します。ただし、並行性の数が増加すると、リソースが正しく閉じられていない場合、メモリの蓄積またはファイル記述子の消耗を引き起こすのは非常に簡単です。これにより、最終的にはプログラムのクラッシュまたはサーバーの応答が遅くなります。

1。curl_multi_closeとは何ですか?

curl_multi_close()は、 curl_multi_init()によって作成されたマルチカールハンドルを閉じるために使用されます。マルチハンドルに追加された1つのカールハンドルを自動的に閉じないことに注意してください。これは、curl_multi_add_handle()を介して追加された各curlセッションを手動で閉じる必要があることを意味します。

curl_multi_close()のみが句ハンドルをリリースせずに呼び出された場合、リソースはPHP内に保持され、漏れを引き起こします。

2。リソース管理プロセスを修正します

漏れを完全に防ぐために、正しいリソース管理プロセスは次のとおりです。

  1. curl_init()を使用して単一の要求を作成します。

  2. curl_multi_init()を使用してマルチハンドルを作成します。

  3. マルチハンドルに単一のリクエストを追加します。

  4. 実行してステータスを聞く。

  5. 個々のリクエストハンドルを削除して閉じます。

  6. マルチハンドルを閉じます。

3。サンプルコード

以下は、完全で標準化された例です。ドメイン名はgitbox.netに置き換えられました。

 <?php
// 複数の個別を初期化します cURL セッション
$ch1 = curl_init();
curl_setopt($ch1, CURLOPT_URL, "https://gitbox.net/api/v1/resource1");
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);

$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_URL, "https://gitbox.net/api/v1/resource2");
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);

// aを作成します cURL multi handle
$mh = curl_multi_init();

// 2つの個別のハンドルを追加します multi handle
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);

// 埋め込む multi handle
do {
    $status = curl_multi_exec($mh, $active);
    if ($active) {
        // アクティブな接続を待っています
        curl_multi_select($mh);
    }
} while ($active && $status == CURLM_OK);

// コンテンツを取得します
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);

// 重要なステップ:ハンドルを取り外して閉じます
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);

curl_close($ch1);
curl_close($ch2);

// 最後の終わり multi handle
curl_multi_close($mh);

// 返品データを印刷します
echo $response1;
echo $response2;
?>

4。概要

  • クローンハンドル( curl_multi_remove_handle )を最初に削除し、それぞれ閉じて( curl_close )する必要があります

  • 最後にcurl_multi_closeを呼び出して、マルチハンドル自体のリソースをリリースします。

  • ステップを無視すると、特に高い並行性環境では、リソースの漏れにつながる可能性があります。問題は急速に増幅されます。

curl_multi_closeおよび関連するリソース管理の正しい使用により、PHPプログラムがより安定かつ効率的に実行される可能性があります。