PHPでは、 curl_multi_execおよびcurl_multi_info_readは非常に実用的な関数です。この記事では、これら2つの機能を使用して効率的な並列リクエストを実現し、特定のコードの例を提供する方法を詳細に紹介します。
curl_multi_exec :マルチプレックスを実装するために一連のカールハンドルを実行するために使用されます。すべての参加要求を並行して実行します。
curl_multi_info_read :完了した要求に関する情報を取得するために使用され、リクエストが終了したかどうかを検出し、対応する結果を処理します。
複数のシングルカール要求(カールハンドル)を初期化します。
多重化されたハンドルを作成します。
すべての個々のリクエストを多重化したハンドルに追加します。
curl_multi_execに電話して、すべてのリクエストの実行を開始します。
curl_multi_info_readを介して要求が完了したかどうかを継続的に検出します。
完了要求の結果を処理します。
リソースをクリーンアップします。
<?php
// 要求するURLリスト
$urls = [
'http://gitbox.net/api/endpoint1',
'http://gitbox.net/api/endpoint2',
'http://gitbox.net/api/endpoint3',
];
// 初期化 multi handle
$multiHandle = curl_multi_init();
$curlHandles = [];
// 1. シングルを作成しますcurlハンドル,そして参加しますmultiハンドル
foreach ($urls as $url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 直接出力の代わりに結果を返します
curl_multi_add_handle($multiHandle, $ch);
$curlHandles[] = $ch;
}
// 2. すべてのリクエストを実行します
$running = null;
do {
// リクエストを実行します
curl_multi_exec($multiHandle, $running);
// オプション:アクティブな接続を待っています,防ぐCPU占有が高すぎる
curl_multi_select($multiHandle);
// 3. 完了したリクエストがあるかどうかを確認してください
while ($info = curl_multi_info_read($multiHandle)) {
if ($info['msg'] === CURLMSG_DONE) {
$handle = $info['handle'];
// コンテンツを取得します
$content = curl_multi_getcontent($handle);
// 返品コンテンツの処理,たとえば、印刷または解析
echo "リクエストを完了します,コンテンツの長さ:" . strlen($content) . "\n";
// 移除完成的ハンドル,無料のリソース
curl_multi_remove_handle($multiHandle, $handle);
curl_close($handle);
}
}
} while ($running > 0);
// 4. 閉鎖multiハンドル
curl_multi_close($multiHandle);
?>
curl_multi_init() :多重化されたハンドルを初期化します。
curl_multi_add_handle() :各個々の要求されたCurlハンドルをマルチハンドルに追加します。
curl_multi_exec() :すべてのリクエストを実行します。
curl_multi_select() :CPUのアイドリングを避けるためにアクティブな接続を待ちます。
curl_multi_info_read() :完了要求の関連情報を読み取り、リクエストが終了したかどうかを判断します。
curl_multi_remove_handle()およびcurl_close() :メモリリークを避けるためにリソースをクリーンアップします。
すべてのリクエストが完了するまでループ( $ runningは0になります)。
並列リクエストの数は、過度のサーバー圧力やシステムリソースのボトルネックを避けるために大きすぎてはなりません。
curl_multi_select()を使用して、プログラムが高いCPU使用に陥るのを防ぐために待機します。
返されたコンテンツを処理するときは、エラーチェックに注意して、リクエストが成功したことを確認してください。
投稿、ヘッダー、認証などの複雑なリクエストを開始する必要がある場合は、単一のカールハンドルを初期化するときに対応するオプションを設定できます。