現在の位置: ホーム> 最新記事一覧> 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マルチハンドルを破壊し、マルチハンドルに関連するリソースを自動的にリリースすることです。ただし、 curl_initによって作成され、マルチハンドルに追加された個々のCurlハンドルを自動的に閉じませんcurl_multi_closeを呼び出す前に、 curl_closeを使用して個々のCurlハンドルを手動で閉じる必要があります。

そうでない場合、これらの個別のカールハンドルは依然としてメモリリソースを占有しているため、メモリリークにつながる可能性があります。

正しいリソース管理の例

以下は、マルチハンドルとシングルカールハンドルを正しく管理するPHPの例です。

 <?php

// 複数を初期化します curl ハンドル
$ch1 = curl_init('https://gitbox.net/api/endpoint1');
$ch2 = curl_init('https://gitbox.net/api/endpoint2');

// aを作成します 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を使用して、マルチハンドルから単一のハンドルを削除します。

  2. 次に、 curl_closeは各Curlハンドルを個別に閉じます。

  3. 最後に、 curl_multi_closeを使用して、マルチハンドル自体を閉じます。

これにより、すべてのリソースがレガシーハンドルまたはメモリリークなしで正しくリリースされることが保証されます。

まとめ

  • curl_multi_closeは、マルチハンドル自体の破壊のみを担当します。

  • 単一のカールハンドルでは、手動で閉じる必要があります。

  • ハンドルの「ステータス」を確認する必要はありませんが、個々のカールハンドルが削除されて閉じられていることを確認する必要があります。

  • 優れたリソース管理習慣を開発することは、メモリリークとシステムリソースの無駄を回避するための鍵です。