PHPでは、 Curlは強力で一般的に使用されるネットワークリクエストツールであり、 curl_multi_*一連の関数が許可されています。これは、高性能インターフェイス集約、非同期リクエストなどのシナリオで非常に便利です。
ただし、多くの開発者は、 curl_multi_*を使用する場合、特にcurl_multi_close()を使用する場合、リソースリリースプロセスを無視することがよくあります。この記事では、標準プロセスをメインラインとして取得し、 curl_multi_init to curl_multi_closeの完全な使用法を段階的に理解し、コードの例で補完されます。
PHPが提供するCURL_MULTI_*一連の関数は、複数の同時CURLハンドルを管理するためのツールです。これは、従来のシングルカール要求とは異なり、複数のHTTP要求を同時に開始できるため、応答効率が向上します。
これらの機能を使用すると、次の手順にほぼ分割できます。
マルチハンドルの初期化: curl_multi_init()
複数のCurlリクエストを追加する(簡単なハンドル): curl_multi_add_handle()
リクエストを実行する: curl_multi_exec()およびcurl_multi_select()
応答コンテンツを取得: curl_multi_getContent()
簡単なハンドルを削除して閉じます: curl_multi_remove_handle()およびcurl_close()
マルチハンドルを閉じる: curl_multi_close()
以下は、3つの異なるURLを同時にリクエストする必要があると仮定して、標準のマルチレクエストプロセスです。
<?php
// 要求する URL リスト
$urls = [
"https://gitbox.net/api/service1",
"https://gitbox.net/api/service2",
"https://gitbox.net/api/service3"
];
// 初期化 multi handle
$multiHandle = curl_multi_init();
$curlHandles = [];
// 1. それぞれのため URL aを作成します curl easy handle そして追加します multi handle 真ん中
foreach ($urls as $i => $url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($multiHandle, $ch);
$curlHandles[$i] = $ch;
}
// 2. 埋め込む multi 聞く
$active = null;
do {
$mrc = curl_multi_exec($multiHandle, $active);
// インターネットを待っています I/O 準備をしてください,避ける CPU 占有が高すぎる
if ($mrc == CURLM_OK) {
curl_multi_select($multiHandle);
}
} while ($active > 0 && $mrc == CURLM_OK);
// 3. コンテンツとクリーンハンドルを取得します
$responses = [];
foreach ($curlHandles as $i => $ch) {
// 応答コンテンツを取得します
$responses[$i] = curl_multi_getcontent($ch);
// シングルを取り外して閉じます handle
curl_multi_remove_handle($multiHandle, $ch);
curl_close($ch);
}
// 4. 最後の終わり multi handle,無料のリソース
curl_multi_close($multiHandle);
// 出力結果
foreach ($responses as $index => $body) {
echo "Response from URL #{$index}: \n";
echo $body . "\n\n";
}
curl_multi_close()は簡単なハンドルをすぐに破壊しませんが(最初にそれらを取り外して閉じる必要があります)、マルチハンドル自体が占める基礎となるリソースを解放する責任があります。呼び出すのを忘れた場合、レジデントプロセスなどの長期にわたるスクリプトでメモリリークまたはファイル記述子の疲労を引き起こす可能性があります。
要約: curl_multi_init()を使用するスクリプトは、 curl_multi_close()で終了する必要があります!
ブロッキングとスタックをリクエストしますか?
curl_multi_select()が正しく使用されているかどうかを確認してください。
curl_setopt(...、curlopt_returntransfer、true)が見逃さないことを確認してください。
メモリリークまたは接続の例外?
curl_multi_remove_handle()とcurl_close()は、各リクエストの後に呼び出されますか?
curl_multi_close()は最終的に呼び出されますか?
curl_multi_*は、ネットワークを同時にリクエストする際に非常に効率的な手段を提供します。 curl_multi_init()からcurl_multi_close()までの完全なプロセスをマスターすると、コードパフォーマンスとリソース管理機能を効果的に改善できます。
これらの3つの「必須」を覚えておいてください:
各リクエストはマルチハンドルに追加する必要があります。
各リクエストは、完了時に削除および閉じている必要があります。
最後に、multiリソースを解放するには、 curl_multi_close()を呼び出す必要があります。
標準化されたプロセスとリソース管理を通じて、PHPの同時リクエストはより堅牢で効率的になります。