2017-06-20 18 views
0

次のスクリプトを使用してcurl_multi_exec経由で別のサーバからデータを取得しているスクリプトがありますが、このスクリプトは問題なく動作していますが、curl_multi_exec()が多すぎるメモリを使用しています

$curly = array(); // array of curl handles 
$result = array(); // data to be returned 
$mh = curl_multi_init(); // multi handle 
foreach ($xmlarray as $id => $d) { 
    $curly[$id] = curl_init(); 
    curl_setopt($curly[$id], CURLOPT_URL, $url); 
    curl_setopt($curly[$id], CURLOPT_POST, true); 
    curl_setopt($curly[$id], CURLOPT_POSTFIELDS, $d); 
    curl_setopt($curly[$id], CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($curly[$id], CURLOPT_TIMEOUT, 60); 
    curl_setopt($curly[$id], CURLOPT_SSLVERSION, 3); 
    curl_multi_add_handle($mh, $curly[$id]); 
} // query data for each of sub queries on the $xmlarray 
    $running = null; // execute the handles 
    do { 
     curl_multi_exec($mh, $running); 
     curl_multi_select($mh); 
    } while($running > 0); 
    foreach($curly as $id => $c) { 
     $result[$id] = curl_multi_getcontent($c); 
     curl_multi_remove_handle($mh, $c); 
    }// get content and remove handles 
    $active = null; 
    curl_multi_close($mh); 
    file_put_contents('test.xml',$result); 

$xmlarrayここには約500人のユーザーが含まれています。 5000ユーザーのためのスクリプトを実行するとき - すべて正常に動作します。10000ユーザーのために実行すると、メモリ不足例外が発生し、デバッグはcurl_multi_exec()によって最も多くのメモリが使用されていることを示します。

私がこれを克服する最良の方法は何ですか?どんな援助も高く評価されています!前もって感謝します。

EDIT各バッチ別途(下記のコード)アレイとアクションの数に私の$ xmlarrayを分割しようとしました

。このソリューションでは、5kユーザーから13kユーザーに処理されました。

 $xmlarrayB = array_chunk($xmlarray, 5, true); 
     if(is_array($xmlarrayB)) { 
      foreach ($xmlarrayB as $xmlarrayBA) { 
       $curly = array(); // array of curl handles 
       $result = array(); // data to be returned 
       $mh = curl_multi_init(); // multi handle 
       foreach ($xmlarrayBA as $id => $d) { 
        $curly[$id] = curl_init(); 
        curl_setopt($curly[$id], CURLOPT_URL, $url); 
        curl_setopt($curly[$id], CURLOPT_POST, true); 
        curl_setopt($curly[$id], CURLOPT_POSTFIELDS, $d); 
        curl_setopt($curly[$id], CURLOPT_RETURNTRANSFER, true); 
        curl_setopt($curly[$id], CURLOPT_TIMEOUT, 60); 
        curl_setopt($curly[$id], CURLOPT_SSLVERSION, 3); 
        curl_multi_add_handle($mh, $curly[$id]); 
       } // query data for each of sub queries on the $xmlarray 
       $running = null; // execute the handles 
       do { 
        curl_multi_exec($mh, $running); 
        curl_multi_select($mh); 
       } while($running > 0); 
       foreach($curly as $id => $c) { 
        $result[$id] = curl_multi_getcontent($c); 
        curl_multi_remove_handle($mh, $c); 
       }// get content and remove handles 
       $active = null; 
       //execute the handles 
       curl_multi_close($mh); 
      } 
     } 

どのようにして5okユーザーの数を増やすかについてのアイデアはありますか?

EDIT2

- サンプルの$ xmlarrayちょうど2のためのユーザー

受け入れエンコード:gzipで &トークン= 305c7c5be78b5c8dd583312fe20578ac &サブID = test_sub_id & idomain = adk.mediaff.com & cdomain = adk.mediaffを。 com &リクエスト=%3Crequest%3E%3Cemail%3E%3Crecipient%3Ed3e51df8f588139fb210d898c5964c3f%3C%2Frecipient%3E%3Clist%3E23413%3C%2Flist%3E%3Cdomain%3Eicloud.com%3C%2Fdomain%3E%3Countrycode%3E%3C %2Fcountrycode%3E%3Cmetrocode%3E%3C%2Fmetrocode%3E%3Costコード%3E%3C%2Fostalcode%3E%3Cgen 3C%2Fest%3E%3C%2Femail%3E%3Cemail%3E%3Crecipient%3E728929dfbc0d785e41316d4fa97518e9%3C%2Frecipient%3E%3Clist%3E23413%3C%2Flist%3E%%3E2%3C%2Fgender%3E% 3Cdomain%3Ehotmail.com%3C%2Fdomain%3E%3Countrycode%3E%3C%2Fcountrycode%3E%3Crocodeode%3E%3C%2Fmetrocode%3E%3Costコード%3E%3C%2Fostalcode%3E%3Cgender%3E1%3C%2Fgender% 3E%3Ctest%3E0%3C%2Ftest%3E%3C%2Femail%3E%3C%2Frequest%3E &テスト= 0

+0

これらの要求はバッチで実行でき、各バッチには5000ユーザーが含まれます。 –

+0

@DileepKumar、私はこれがまさに私がやっていることだと思います。各リクエストにはさらに500人以下のユーザーが含まれているはずです。この場合の私の懸念は、それぞれの要求で500人のユーザがcurl_multi_exec()で10の接続を実行しているのに対し、50000のユーザでは100の接続を実行していることです。私はあなたの提案を正しい方法で理解することを願っています! –

+0

あなたはどのバージョンのPHPを使用していますか? –

答えて

1

私は多分500または5000チャンクサイズチャンクにあなたの配列$xmlarrayを分割するために、あなたをお勧めします。

これらのチャンクごとにカールリクエストを実行します。結果をファイルに入れようとするときは、FILE_APPENDfile_put_contentsを使用してください。そうでない場合、ファイルは各チャンクに上書きされます。

+0

あなたのソリューションは5000ユーザーから13000ユーザーになりました。私は50kユーザーまでそれを得るために他に何かできますか? –

+0

@ Sky21.86チャンクサイズを5から10に増やしてみてください。また、$ resultをファイルに格納する場所はどこですか?ループ内または外部ループ内 –

関連する問題