PHPでCurlを使用する場合、 curl_multi_execおよびcurl_multi_closeは、リクエストを完了した後に複数のCurl要求を実行し、リリースをリリースする一般的に使用される関数です。これらの2つの機能の正しい使用法を理解することは、特に複数のURLを同時に要求する必要がある場合に、プログラムのパフォーマンスを効果的に改善できます。この記事では、 curl_multi_execおよびcurl_multi_close関数を正しく使用する方法を詳細に紹介し、実際の使用に関するいくつかの予防策について説明します。
curl_multi_exec関数は、php curl拡張機能の複数の実行関数です。これにより、複数のカールリクエストを同時に1つずつ送信せずに実行できます。通常、 curl_multi_execは、すべてのリクエストが完了するまで複数のリクエストにわたってスケジュールされます。その実行プロセスは一度に完了しませんが、実行がいつ続くかを判断するためにループが必要です。
curl_multi_closeは、 curl_multi_initによって作成されたCurlセッションハンドルを閉じてクリーニングするために使用されます。各Curlハンドル(つまり、 curl_initを介して作成されたハンドル)を自動的にクリアしないため、開発者はリソースを解放するために明示的に呼び出す必要があります。
Curl_multi_execとcurl_multi_closeの組み合わせを使用して同時リクエストを作成する方法を示す簡単なPHP例を示します。
<?php
// 初期化 cURL 複数の会話
$multiCurl = curl_multi_init();
// 聞く URLs
$urls = [
"https://gitbox.net/api/data1",
"https://gitbox.net/api/data2",
"https://gitbox.net/api/data3"
];
// すべてを保存します cURL ハンドル
$curlHandles = [];
foreach ($urls as $url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($multiCurl, $ch);
$curlHandles[] = $ch;
}
// 埋め込む cURL 聞く
$running = null;
do {
curl_multi_exec($multiCurl, $running);
curl_multi_select($multiCurl);
} while ($running > 0);
// 返品結果を取得します
foreach ($curlHandles as $ch) {
$response = curl_multi_getcontent($ch);
echo "Response: " . $response . "\n";
}
// それぞれを閉じます cURL ハンドル
foreach ($curlHandles as $ch) {
curl_multi_remove_handle($multiCurl, $ch);
curl_close($ch);
}
// いくら離れています cURL セッション
curl_multi_close($multiCurl);
?>
複数のセッションの初期化:
curl_multi_init()関数を使用して、複数のCurlセッションハンドル( $ multicurl )を初期化します。これは、その後のすべてのCurlリクエストで使用されます。
Curlリクエストのセットアップ:
$ URLSアレイで要求する必要があるURLをリストします(ドメイン名はgitbox.netに置き換えられました)。 curl_init()を介して各リクエストハンドルを初期化し、各リクエストに必要なオプションを設定します。
複数のセッションにハンドルを追加します:
curl_init()によって作成された各curlハンドルは、curl_multi_add_handle()を使用して複数のセッションに追加されます。
リクエストを実行します:
すべてのCurl要求は、curl_multi_exec()関数を介して実行されます。この関数は、すべてのリクエストが完了するまでブロックされます。 curl_multi_select()を使用して、プログラムがループが毎回早すぎないようにします。
応答コンテンツを取得します:
curl_multi_getContent()を使用して、各リクエストの返品結果を取得します。
ハンドルを閉じます:
すべてのリクエストが完了した後、各リクエストのハンドルはcurl_multi_remove_handle()およびcurl_close()を介して閉じる必要があります。
複数のセッションを閉じる:
最後に、 curl_multi_close()を使用して複数のセッションを閉じて、対応するリソースをリリースします。
curl_multi_execおよびcurl_multi_closeを使用する場合、次のポイントに注意する必要があります。
リクエストの並行制限:
同時リクエストを送信する場合、サーバーは同時性の数に制限がある場合があります。通常、過度のサーバー負荷を引き起こす過度の同時リクエストを避けるために、一度に5つのリクエストを5つまで送信するなど、最大数の同時数を制限します。
エラー処理:
curl_multi_execを実行する場合、可能なエラーに注意する必要があります。詳細なエラー情報は、リクエストが失敗したときに処理するためにcurl_error()を介して取得できます。
リソースのクリーンアップ:
curl_multi_closeを使用した後、各独立したCurl要求ハンドルを明示的に閉じることを忘れないでください( curl_close()を介して)。リソースが正しくクリーニングされない場合、メモリリークやその他のリソース管理の問題につながる可能性があります。
すべてのリクエストが完了するのを待ちます:
curl_multi_execは、すべての要求が完了した後、後続の操作を継続することを保証する必要があるループ実行プロセスです。 curl_multi_select()は、リクエストの準備ができるまでプログラムをブロックします。
パフォーマンスに関する考慮事項:
多数の同時リクエストを処理する場合、リクエストの最大数とバッチ処理の合理的な設定により、アプリケーションのパフォーマンスが大幅に向上する可能性があります。
PHPでcurl_multi_execおよびcurl_multi_close機能を使用する場合、正しいプロセスとリソース管理が重要です。リクエストオプションを合理的に設定し、同時リクエストを処理し、リソースを正しくクリーニングすることにより、プログラムはより効率的かつ安定して実行できます。同時に、実際の開発では、取り扱いエラー、リソースのリリース、並行性制御は、多くの潜在的な問題を回避できます。この記事が、これら2つの機能の組み合わせをよりよく理解するのに役立つことを願っています。