現在の位置: ホーム> 最新記事一覧> php curl_multi_closeは、curl_multi_initで一般的な問題を解決します

php curl_multi_closeは、curl_multi_initで一般的な問題を解決します

gitbox 2025-05-29

PHPでは、 curl_multi_*一連の関数を使用して、複数のHTTP要求を同時に処理するのに役立ちます。同時リクエストを完了すると、 curl_multi_closeを使用してCurlハンドルを閉じる必要があります。これは、通常、すべての同時リクエストが実行された後に行われます。この記事では、 curl_multi_closeの使用方法、一般的なエラー、およびそれらを解決する方法について説明します。

curl_multi_closeの使用

curl_multi_close関数は、 curl_multi_initによって初期化されたcurlマルチハンドルを閉じるために使用されます。その機能は、関連するリソースをクリーンアップし、メモリリークを回避することです。使用する場合、通常、 curl_multi_initを使用して複数のCurlハンドルを初期化し、ハンドルを閉じるためにすべてのリクエストが実行された後にcurl_multi_closeを呼び出します。

サンプルコード

<?php
// 初期化cURL複数のハンドル
$mh = curl_multi_init();

// 初期化cURLシングルハンドル
$ch1 = curl_init();
curl_setopt($ch1, CURLOPT_URL, "https://gitbox.net/api/v1/data1");
curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);

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

// 将ハンドル添加到複数のハンドル中
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);

// 複数を実行しますcURL聞く
$running = null;
do {
    curl_multi_exec($mh, $running);
} while ($running > 0);

// 閉鎖cURLハンドル
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);

// 閉鎖单个cURLハンドル
curl_close($ch1);
curl_close($ch2);

echo "聞く完成!";
?>

上記の例では、 curl_multi_initはマルチハンドル$ mhを初期化し、2つの個別のCurlハンドル$ CH1$ CH2を作成します。これらの2つのハンドルは、 curl_multi_add_handleを介して$ mhに追加され、複数のHTTP要求が実行されます。最後に、 curl_multi_remove_handleを使用してこれらのハンドルを削除し、 curl_multi_closeを呼び出して複数のハンドルを閉じて関連するリソースをクリーンアップします。

curl_multi_initの一般的なエラーとソリューション

curl_multi_closeは単純ですが、 curl_multi_initで使用すると、いくつかの一般的な問題やエラーも遭遇します。次に、これらの一般的なエラーとそのソリューションについて説明します。

1.エラー:カールマルチハンドルは正しく初期化されません

エラーの説明: curl_multi_initに電話して複数のハンドルを初期化し、直接ハンドルの追加を開始することを忘れる場合があります。

回避策: curl_multi_add_handleを呼び出す前に、複数のハンドルが適切に初期化されていることを確認してください。また、 curl_multi_closeを使用して最後にクリーンアップすることも忘れないでください。

 <?php
$mh = curl_multi_init(); // 确保已经初期化

// 他のコード...
curl_multi_add_handle($mh, $ch1);
curl_multi_add_handle($mh, $ch2);

// 最后閉鎖
curl_multi_close($mh);
?>

2。エラー:すべてのハンドルが正しく閉じられていません

エラーの説明:すべての要求が完了した後、またはcurl_multi_closeが複数のハンドルを閉じるために使用されない場合、 curl_multi_remove_handleが適切に呼び出されない場合、リソースリークが発生する場合があります。

回避策:複数のハンドルに追加された個々のカールハンドルが削除され、 curl_multi_closeが最後に呼び出されることを確認してください。

 <?php
// 确保移除所有ハンドル
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);  // リソースをクリーンアップします
?>

3。エラー:複数のリクエストが完了していません

エラーの説明:複数のCurl要求を実行すると、 curl_multi_closeがすべてのリクエストが完了するのを待たない場合、リクエストが完全に実行されないという問題に遭遇する可能性があります。

回避策: curl_multi_execループを使用して、すべてのリクエストが完了していることを確認します。 curl_multi_execは、すべてのリクエストが完了するまで実行されます。

 <?php
$running = null;
do {
    curl_multi_exec($mh, $running);
} while ($running > 0);  // 等待所有聞く完成

curl_multi_close($mh);  // 閉鎖複数のハンドル
?>

要約します

curl_multi_closeは、複数のCurl要求を処理するときに無視できないステップです。同時リクエストが完了した後、関連するリソースをリリースできるようになります。 curl_multi_initで使用する場合、一般的なエラーは主に初期化とリソースクリーニングに焦点を当てています。ほとんどのエラーは、コードを慎重にチェックし、各ステップが正しく実行されるようにすることで回避できます。

うまくいけば、この記事は、 curl_multi_closecurl_multi_initをよりよく理解し、使用するのに役立ちます。さらに質問がある場合は、メッセージを残して議論してください!