この記事では、2 つの具体的な実装方法について説明し、さまざまな方法の簡単なパフォーマンスの比較を行います。
1. 古典的な cURL 同時実行メカニズムとその既存の問題
たとえば、PHP オンラインマニュアルの次の実装方法を参照してください。
コードをコピーします。 コードは次のとおりです。
function classic_curl($urls, $lay) {
$queue =curl_multi_init();
$map = array(); urls as $url) {
// cURL リソースを作成します
$ch =curl_init();
// URL とその他の適切なオプションを設定します
curl_setopt($ch, CURLOPT_URL, $url) );
curl_setopt($ch, CURLOPT_TIMEOUT, 1);
curl_setopt($ch, CURLOPT_HEADER, 0); ch, CURLOPT_NOSIGNAL, true );
// ハンドルを追加
curl_multi_add_handle($queue, $ch);
$map[$url] = $ch; 🎜>$active = null;
// ハンドル
do {
$mrc =curl_multi_exec($queue, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM) ;
while ($active > 0 && $mrc == CURLM_OK) {
if (curl_multi_select($queue, 0.5) != -1) {
do {
$mrc =curl_multi_exec($queue , $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
$responses = array(); ($map as $url= >$ch) {
$responses[$url] = callback(curl_multi_getcontent($ch), $delay);
curl_multi_remove_handle($queue, $ch); curl_close($ch);
}
curl_multi_close($queue);
return $responses;
最初にすべての URL を同時キューにプッシュします、並行プロセスを実行します。データの解析やその他の後続の処理の前に、すべてのリクエストが受信されるのを待ちます。実際の処理プロセスでは、ネットワーク送信の影響を受けて、一部の URL のコンテンツが他の URL よりも前に返されますが、従来の cURL と同様です。同時実行性は、最も遅い URL が返されるまで待機する必要があります。処理は後で開始され、待機すると CPU のアイドル状態と無駄が発生します。URL キューが短い場合、このアイドル状態と無駄はまだ許容範囲内ですが、キューが長い場合は、この待機と無駄が発生します。
2. 改善されたローリング cURL 同時実行方式
慎重に分析した結果、クラシックではまだ最適化の余地があることがわかりました。 cURL の同時実行性。URL が最適化されると、リクエストの完了後、処理やその他の作業を開始する前に最も遅いインターフェイスが返されるのを待つのではなく、できるだけ早くリクエストを処理し、処理中に他の URL が返されるのを待ちます。 CPU のアイドル状態と無駄。 早速、具体的な実装を貼り付けます:
コードをコピー
$ ch =curl_init(); curl_setopt($ch, CURLOPT_TIMEOUT, 1); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_NOSIGNAL, true);
curl_multi_add_handle($queue, $ch); ch] = $url;
}
$responses = array();
do {
while (($code =curl_multi_exec($queue, $active)) == CURLM_CALL_MULTI_PERFORM) ;
if ($code != CURLM_OK) { Break; }
// リクエストが完了しました --
while ($done =curl_multi_info_read($queue) )) {
// リクエストで返された情報とコンテンツを取得します
$info =curl_getinfo($done['handle']);
$error =curl_error($done['handle]); ']);
$results = callback(curl_multi_getcontent ($done['handle']), $delay);
$responses[$map[(string) $done['handle']]] = コンパクト('info', 'error', 'results') ;
// 完了したばかりのカールハンドルを削除します
curl_multi_remove_handle($queue, $done['handle']); ($done['handle']);
}
// 出力のデータのブロックは、curl_multi_exec によって行われます
if ($active > 0) {
curl_multi_select($queue, 0.5);
}
} while ($active)
return $responses; >
3. 2 つの同時実装のパフォーマンス比較
改善前と後のパフォーマンス比較テストは、LINUX ホストで実行されました。テスト中に使用された同時キューは次のとおりです。次のように:
http://item.taabao.com/item.htm?id=14392877692
http://item.taobao.com/item.htm?id=16231676302
http ://item.taobao .com/item.htm?id=17037160462
http://item.taobao.com/item.htm?id=5522416710
http://item.taobao.com/item .htm?id=16551116403
http://item.taabao.com/item.htm?id=14088310973
実験計画の原則とパフォーマンス テスト結果の形式を簡単に説明します。結果の信頼性を評価するには、同じインターフェイス URL セットを指定して 1 回の実験で各セットの実験を 20 回繰り返し、2 つの同時実行メカニズムの消費時間 (秒単位) を測定します。クラシック (従来の同時実行メカニズムを指します) とローリング (改善された同時実行メカニズムを参照) で最も短い時間が勝者 (Winner) となり、節約された時間 (Excellence、秒) とパフォーマンス向上率 (Excel. %) が計算されます。実験を単純に保ちながら、実際のリクエストにできるだけ近づけます。返された結果の処理では、他の複雑な操作を実行せずに、単純な正規表現のマッチングのみを実行しました。さらに、結果処理コールバックの影響を確認するために、パフォーマンス比較テストの結果を基に、usleep を使用して、実際のより信頼性の高いデータ処理ロジック (抽出、単語の分割、ファイルやデータベースへの書き込みなど) をシミュレートできます。
パフォーマンス テストで使用されるコールバック関数。
コードをコピー コードは次のとおりです:
function callback($data, $delay) {
preg_match_all('/