3

したがって、ノンブロッキングのカールリクエストを作成するためのこの機能があります。これまでにテストしたもの (少量のリクエスト) では問題なく動作します。しかし、数千のリクエスト (おそらく最大 10,000) にスケールアップするには、これが必要です。私の問題は、一度に実行される並列リクエストが多すぎるという問題に遭遇したくないということです。

リクエストをレート制限するために何を提案しますか? 眠い?バッチでのリクエスト? 機能は以下です。

function poly_curl($requests){

            $queue = curl_multi_init(); 
            $curl_array = array(); 
            $count = 0;
            foreach($requests as $request) 
            { 
                $curl_array[$count] = curl_init($request); 
                curl_setopt($curl_array[$count], CURLOPT_RETURNTRANSFER, true); 
                curl_multi_add_handle($queue, $curl_array[$count]); 
                $count++;
            } 

            $running = NULL; 
            do { 

               curl_multi_exec($queue,$running); 

            } while($running > 0); 

            $res = array(); 
            $count = 0;
            foreach($requests as $request) 
            { 
                $res[$count] = curl_multi_getcontent($curl_array[$count]); 
                $count++;
            } 

            $count = 0;
            foreach($requests as $request){ 
                curl_multi_remove_handle($queue, $curl_array[$count]); 
                $count++;
            } 
            curl_multi_close($queue);        
            return $res; 
    }
4

4 に答える 4

2

curl_multi_exec100 個のグループでバッチを使用しても、99 個のリクエストが終了する可能性があり、最後のリクエストの完了を待つ必要があるため、この目的には悪いと思います。

ただし、100 個の並列リクエストが必要で、1 つが終了するとすぐに別のリクエストが開始されます。したがって、まったく使用できませんcurl_multi_exec

通常のプロデューサー/コンシューマー アルゴリズムを複数 (定数) のコンシューマーで使用し、すべてのコンシューマーが 1 つの URL のみを処理します。たとえば、php-resqueCOUNT=100 php resque.php

于 2012-10-06T13:07:01.020 に答える
1

Exponential Backoff ( wikipedia )と呼ばれるものを実装したい場合があります。

基本的に、フィードバックに応じてプロセスを動的にスケーリングできるアルゴリズムです。

アプリケーションでレートを定義し、最初のタイムアウト、エラー、または任意の決定で、リクエストが終了するまでこのレートを下げます。

たとえば、HTTP 応答コードを使用して簡単に実装できます。

于 2012-10-06T12:38:10.247 に答える