ホームページ > php教程 > php手册 > PHPカール同時実行のベストプラクティスコード共有

PHPカール同時実行のベストプラクティスコード共有

WBOY
リリース: 2016-06-13 11:58:33
オリジナル
837 人が閲覧しました

この記事では、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 のアイドル状態と無駄。 早速、具体的な実装を貼り付けます:



コードをコピー


コードは次のとおりです:

関数 Rolling_curl($urls, $delay) { $queue =curl_multi_init();
$map = array();

foreach ($urls として $url) {

$ 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('/

(. )

/iU', $data, $matches);
usleep($delay);
return Compact('data', 'matches') ;
}


データ処理コールバックに遅延がない場合: Rolling Curl はわずかに向上しますが、パフォーマンスは向上します
データ処理コールバックの遅延は 5 です。ミリ秒: ローリング Curl が優先され、パフォーマンスが約 40% 向上します。
上記のパフォーマンスの比較により、同時実行量が非常に多い場合は、ローリング cURL がより適切な選択肢となるはずです。 1000)、同時キューの最大長 (20 など) を制御できます。URL が返されて処理されると、要求されていない URL がすぐにキューに追加されるため、この方法で記述されたコードはより堅牢になります。同時実行数が大きすぎても、スタックしたりクラッシュしたりすることはありません。実装の詳細については、http://code.google.com/p/rolling-curl/ を参照してください。
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート