現代のフロントエンド開発では、JavaScriptの約束。allは、複数の非同期リクエストの同時実行を処理するための強力なツールです。これにより、複数のリクエストを同時に開始でき、後続のロジックを実行する前にすべてのリクエストが完了するのを待ちます。サーバー側の言語として、PHPには直接的な約束のメカニズムはありませんが、 curl_multiシリーズ関数を介して同様の同時リクエスト処理を実装することもできます。この記事では、 curl_multi_info_readを使用して、 Promise.allと同様の同時リクエスト処理を実装する方法を説明することに焦点を当てています。
通常のcurl_execは同期です。つまり、各リクエストは、次のステップを実行し続ける前に結果が戻るのを待つ必要があります。送信する複数のリクエストがある場合、順次実行効率は非常に非効率的です。 curl_multiを使用すると、複数のリクエストを同時に開始し、パフォーマンスを改善するためにそれらを同時に処理できます。
複数の独立したCurlハンドル( curl_init )を作成します。
これらのハンドルをcurl_multiハンドルに追加します。
curl_multi_execループを使用して、すべてのリクエストを実行します。
curl_multi_info_readを使用して、完了した要求情報を取得します。
完成したハンドルを閉じて、結果を保存します。
すべてのリクエストが完了するのを待ちます。
次のサンプルコードは、複数のURLを同時に要求し、すべてのリクエストが完了した後に均一に処理する方法を示しています。この例のURLドメインは、 M66.netに置き換えられます。
<?php
// 要求するURLリスト
$urls = [
'https://m66.net/api/user',
'https://m66.net/api/order',
'https://m66.net/api/product',
];
// 初期化 curl_multi ハンドル
$mh = curl_multi_init();
$handles = [];
// 初期化所有聞くハンドル并加入 multi ハンドル
foreach ($urls as $key => $url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
// あなたのニーズに応じて調整するためのタイムアウトやその他のオプションを設定します
curl_multi_add_handle($mh, $ch);
$handles[$key] = $ch;
}
// すべてのリクエストを実行します
$running = null;
do {
curl_multi_exec($mh, $running);
// アクティブな接続を待っています,効果的に減少しますCPU使用率
curl_multi_select($mh);
// 完了したリクエストを読んでください
while ($info = curl_multi_info_read($mh)) {
if ($info['msg'] == CURLMSG_DONE) {
// 找出仕上げる聞く的ハンドル
$finishedHandle = $info['handle'];
// 対応するものを見つけます key
$key = array_search($finishedHandle, $handles, true);
// コンテンツとステータスコードを取得します
$content = curl_multi_getcontent($finishedHandle);
$httpCode = curl_getinfo($finishedHandle, CURLINFO_HTTP_CODE);
echo "聞く {$urls[$key]} 仕上げる,HTTPステータスコード: {$httpCode}\n";
echo "コンテンツの長さ: " . strlen($content) . " バイト\n\n";
// 关闭并移除已经仕上げる的ハンドル
curl_multi_remove_handle($mh, $finishedHandle);
curl_close($finishedHandle);
// 将对应ハンドル置空,便利な後続の判断
unset($handles[$key]);
}
}
} while ($running > 0);
curl_multi_close($mh);
echo "所有聞く均已仕上げる。\n";
curl_multi_init()マルチリクエスト処理用のハンドルを作成します。
各curl_init()は個別のリクエストを作成し、構成後にマルチリクエストハンドルを追加します。
すべてのリクエストが完了するまで、 curl_multi_exec()を介してリクエストを開始し、ループを呼び出します。
curl_multi_select()を使用して、過度のCPU使用を防ぎます。
Curl_multi_info_read()は、完成した要求情報を返します。
リクエストが完了したら、リソースを無駄にしないように、対応するハンドルを閉じて時間内に削除します。
上記のプロセスを通じて、すべてのリクエストは同時に、完了後に均一に処理され、その効果はPromise.allに似ています。
PHPにはネイティブの約束のメカニズムはありませんが、 Curl_Multiシリーズ関数、特にcurl_multi_info_readを使用して、同時リクエストの管理と結果の処理を完全に実装できます。この方法では、マルチインターフェイス呼び出しを実行するときのPHPスクリプトの効率を大幅に改善でき、複数の外部インターフェイスが同時に呼び出されるシナリオに特に適しています。
この例がPHPの同時リクエストを理解するのに役立つことを願っています!