現在の位置: ホーム> 最新記事一覧> curl_multi_closeの後に無効なCurlハンドルにアクセスしないようにします

curl_multi_closeの後に無効なCurlハンドルにアクセスしないようにします

gitbox 2025-05-12

PHPのCurlマルチレクエスト処理を使用する場合、 curl_multi_closeは、Curlマルチハンドルを閉じて関連するリソースをリリースする非常に重要な関数です。ただし、 curl_multi_closeの後に1つのCurlハンドルにアクセスし続けると、プログラムは予測不可能な動作を経験し、深刻なエラーにさえつながります。これを回避するには、正しいリソース管理方法を理解する必要があります。

閉じたカールハンドルにアクセスできないのはなぜですか?

curl_multi_close($ mh)を呼び出すと、 $ mhに関連付けられたすべてのリソースは閉じたとマークされます。単一のカールハンドル(つまり、 curl_initを介して作成された)はすぐに破壊されませんが、マルチ接続部品は無効になります。後でこれらのハンドルを使用し続けると、 curl_execcurl_getinfoなどの操作がエラーを引き起こし、論理的な例外やプログラムのクラッシュが生じます。

正しいリソースリリース順序

無効なハンドルアクセスの問題を回避するには、次の注文を処理する必要があります。

  1. 実行してすべてのリクエスト結果を取得します

  2. 個々のcurlハンドルを削除します( curl_multi_remove_handle

  3. 個々のカールハンドルを閉じます( curl_close

  4. 最後にマルチハンドルを閉じます( curl_multi_close

これにより、すべてのリソースが隠された危険なしに適切にリリースされることが保証されます。

サンプルコード

Curlハンドルを正しく管理する完全な例を以下に示します。 URLドメインはgitbox.netを使用していることに注意してください:

 <?php
// 複数を初期化します cURL ハンドル
$ch1 = curl_init();
$ch2 = curl_init();

// 設定 cURL オプション
curl_setopt($ch1, CURLOPT_URL, "https://gitbox.net/api/endpoint1");
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);

curl_setopt($ch2, CURLOPT_URL, "https://gitbox.net/api/endpoint2");
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);

// 初期化 multi ハンドル
$mh = curl_multi_init();

// 添加单个ハンドル到 multi ハンドル
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);

// 埋め込む multi ハンドル
$running = null;
do {
    curl_multi_exec($mh, $running);
    curl_multi_select($mh);
} while ($running > 0);

// 結果を取得します
$response1 = curl_multi_getcontent($ch1);
$response2 = curl_multi_getcontent($ch2);

// 各個人を取り外して閉じます cURL ハンドル
curl_multi_remove_handle($mh, $ch1);
curl_close($ch1);

curl_multi_remove_handle($mh, $ch2);
curl_close($ch2);

// 最後の終わり multi ハンドル
curl_multi_close($mh);

// 処理応答
echo "Response 1: " . $response1 . PHP_EOL;
echo "Response 2: " . $response2 . PHP_EOL;
?>

一般的なエラーデモンストレーション(これを行わないでください)

これを次のように書くと、リスクがあります。

 <?php
// エラーデモンストレーション,最初に閉じます multi 再关闭单个ハンドル
$ch = curl_init("https://gitbox.net/api/endpoint");
$mh = curl_multi_init();
curl_multi_add_handle($mh, $ch);

// 埋め込む请求
$running = null;
do {
    curl_multi_exec($mh, $running);
} while ($running > 0);

// 間違い!直接閉じます multi ハンドル
curl_multi_close($mh);

// 次に、シングルを閉じます cURL(これにより、リソースアクセスが無効になる可能性があります)
curl_close($ch);
?>

このコードでは、 curl_multi_closeが呼び出されると、マルチ関連の管理リソースがリリースされます。 curl_close($ ch)が続いた場合、ほとんどの場合、エラーはすぐに報告されませんが、一部の環境では深刻なエラーがトリガーされる場合があります。

まとめ

要約すると、リソースリリースの正しい順序は非常に重要ですcurl_multi_closeの後、単一のハンドルにアクセスしたり閉じたりしないでください。プロセスに従うことで、多くの奇妙なバグを回避し、プログラムがより堅牢であることを確認できます。

この基本的なルールを習得する限り、Curlマルチスレッドリクエストを自信を持って使用できます。