現在の位置: ホーム> 最新記事一覧> ループでCurl_Closeを正しく使用して、メモリリークを避けます

ループでCurl_Closeを正しく使用して、メモリリークを避けます

gitbox 2025-05-28

Curlは、サーバーとデータを交換するためのツールです。 HTTP、HTTP、FTPなどを含むさまざまなプロトコルをサポートします。PHPのCurl拡張機能は、リクエストを簡単に開始し、応答を受け取り、関連するエラーを処理できる簡単なインターフェイスを提供します。

複数のHTTPリクエストを作成する場合、 CURLのリソースは制限されるため、これらのリソースはリクエストが完了した後に時間内にリリースする必要があります。これは、curl_close()関数を呼び出すことによって達成されます。 HTTP要求が接続を閉じることなくループで頻繁に開始されると、メモリリークやサーバーのパフォーマンスの低下になります。

カールの基本的な使用

Curlリクエストを行うとき、通常、次の手順に従います。

  1. カールセッションを初期化します。

  2. リクエストパラメーターを設定します。

  3. リクエストを実行して応答を取得します。

  4. カールセッションを閉じます。

 $ch = curl_init(); // 初期化 cURL セッション
curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/some-endpoint"); // リクエストを設定します URL
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // 応答コンテンツを取得します
$response = curl_exec($ch); // リクエストを実行します
curl_close($ch); // 关闭セッション

ループのメモリリーク問題

リクエストがループで頻繁に開始されると、各リクエストはメモリを割り当てて接続情報を保存します。ループの各反復中にCURLセッションが時間内に閉じられない場合、メモリリークが発生します。そうすることで、PHPスクリプトがあまりにも多くのメモリを消費する可能性があり、最終的にパフォーマンスの問題につながり、サーバーでクラッシュすることさえあります。

たとえば、カールセッションを適切に閉じることなく、ループでリクエストが蓄積し、ますます多くのメモリを消費します。

 // エラーデモンストレーション:ループが閉じていません cURL セッション
for ($i = 0; $i < 1000; $i++) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/some-endpoint");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $response = curl_exec($ch);
    // 電話するのを忘れました curl_close()
}

正しいカールの使用

メモリリークを回避するには、各リクエストが終了した後にcurl_close()関数が呼び出されることを確認する必要があります。最も簡単な方法は、各リクエストが完了した後にリソースが解放されるように、 curl_close()をループ内に配置することです。

 // 正しいデモンストレーション:ループで閉じます cURL セッション
for ($i = 0; $i < 1000; $i++) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/some-endpoint");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $response = curl_exec($ch);
    curl_close($ch); // 及时关闭セッション
}

各リクエストが完了した後にカールセッションを閉じることにより、PHPメモリが無駄にならず、各HTTP要求のリソースが時間内にリリースされることを確認してください。

マルチスレッドカールを使用して、パフォーマンスボトルネックを削減します

多数のリクエストを処理する場合、シングルスレッドループは非常に遅くなる可能性があります。多数のリクエストを処理する必要があり、実行効率を改善する必要がある場合は、マルチスレッドカール(同時カールとも呼ばれます)の使用を検討できます。これにより、リクエストの時間を大幅に短縮し、頻繁なI/O操作によって引き起こされるボトルネックを回避できます。

 // マルチスレッドの使用 cURL パフォーマンスを最適化するため
$mh = curl_multi_init(); // 初期化 cURL 多线程セッション
$handles = [];

for ($i = 0; $i < 1000; $i++) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, "https://gitbox.net/some-endpoint");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_multi_add_handle($mh, $ch); // それぞれを置きます cURL 句柄添加到多线程セッション中
    $handles[] = $ch;
}

// マルチスレッドリクエストを実行します
$active = null;
do {
    $mrc = curl_multi_exec($mh, $active);
} while ($active > 0);

// すべてを閉じます cURL セッション
foreach ($handles as $ch) {
    curl_multi_remove_handle($mh, $ch);
    curl_close($ch);
}

curl_multi_close($mh); // 关闭多线程セッション

これにより、メインプログラムをブロックすることなく、1つのプロセスで複数のリクエストを並行して処理できるため、パフォーマンスが大幅に向上します。