2016-05-04 10 views
0

したがって、https://genderize.io/ APIに接続しています。私は一度に1,000,000件の検索を行う必要があるかもしれないので、できるだけ早くこのAPIから抜け出したいと思っています。異なるcurl_initヘッダーを異なるパラメーターで100,000(要求ごとに10個の名前)接続して、すべて並列に実行できますか?もしできれば本当であることはあまりにも良いようです。また、私はこれを行うことができない場合はどのように他のどのような要求をスピードアップすることができます。現在のコードでは、curl_initのインスタンスを1つ使用し、forループの各サイクルのURLを変更しています。ここに私の現在のループがある:異なるapiでcurl_multi_initを使用することはできますか?

$ch3 = curl_init(); 
for($x = 0; $x < $loopnumber; $x = $x + 10){ 
    $test3 = curl_setopt_array($ch3, array(
     CURLOPT_RETURNTRANSFER => 1, 
     CURLOPT_URL => 'https://api.genderize.io?name[0]=' . $firstnames[$x] . '&name[1]=' . $firstnames[$x+1] . '&name[2]=' . $firstnames[$x+2] . '&name[3]=' . $firstnames[$x+3] . '&name[4]=' . $firstnames[$x+4] . '&name[5]=' . $firstnames[$x+5] . '&name[6]=' . $firstnames[$x+6] . '&name[7]=' . $firstnames[$x+7] . '&name[8]=' . $firstnames[$x+8] . '&name[9]=' . $firstnames[$x+9] 
    )); 
    $resp3 = curl_exec($ch3); 
    echo $resp3; 
    $genderresponse = json_decode($resp3,true); 
+2

"APIは無料ですが、1000の名前/日で制限されています。" "APIはリクエストごとに最大10個の名前に制限されています" –

+0

curl_multi_ * 'が役に立ちますが、実際のボトルネックはAPIを使用して一度に何十万もの通話でそれらをヒットすると、時間が大幅に節約されることはありません。あなたはそれを自分でテストしなければなりません。 – WillardSolutions

+0

@ダゴン私はそれを見ます、私はサービスのために支払うつもりで、1日に1000以上の名前を取得します。私は、各リクエストが10の名前を持つことができ、同時に実行することができるかどうかを私が並行して要求したかどうか疑問に思っていました。 – EdTheSped

答えて

0

TL; DR

はい、それは可能である - 理論的には。しかし、それは実際には機能しません。あなたは、数百の並列接続の中にいるほうがよいでしょう。

あなたは百万簡単にハンドルを作成し、libcurlのマルチハンドルにそれらを追加することができます前に、あなたはおそらく、ソケットを使い果たし、おそらくメモリう長い物語

単一の同じリモートIPおよびポート番号と通信する予定で、ローカルIPアドレスが1つしかなく、それぞれの接続に独自のローカルポート番号が必要な場合は、64Kを超える並列接続を行うことはできません。ほとんどのデフォルト構成のオペレーティングシステムでは、64Kには達しません。 (より多くのリモートIPに話をしたり、接続をバインドするためにもっと多くのローカルIPを持っているならば、もっと多くのことができます。)

この議論のために、実際に最大60Kの同時接続を想定すると、 curl_multi_ * APIは選択/ポーリングに基づいて多くの接続でクロール速度に到達することがわかります。 libcurl自体にはイベントベースのAPIがあります。これはおそらく数百の並列接続を超えたときに推奨されるAPIですが、PHP内からはそのアクセスや使用方法がありません。

関連する問題