2017-06-20 63 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只是爲用戶

的Accept-Encoding:gzip的 令牌& = 305c7c5be78b5c8dd583312fe20578ac &子編號= test_sub_id & idomain = adk.mediaff.com & cdomain = adk.mediaff。 com & request =%3Crequest%3E%3Cemail%3E%3Crecipient%3Ed3e51df8f588139fb210d898c5964c3f%3C%2Frecipient%3E%3Clist%3E23413%3C%2Flist%3E%3Cdomain%3Eicloud.com%3C%2Fdomain%3E%3Ccountrycode%3E%3C %2Fcountrycode%3E%3Cmetrocode%3E%3C%2Fmetrocode%3E%3Cpostalcode%3E%3C%2Fpostalcode%3E%3Cgen DER%3E2%3C%2Fgender%3E%3Ctest%3E0%3C%2Ftest%3E%3C%2Femail%3E%3Cemail%3E%3Crecipient%3E728929dfbc0d785e41316d4fa97518e9%3C%2Frecipient%3E%3Clist%3E23413%3C%2Flist%3E% 3Cdomain%3Ehotmail.com%3C%2Fdomain%3E%3Ccountrycode%3E%3C%2Fcountrycode%3E%3Cmetrocode%3E%3C%2Fmetrocode%3E%3Cpostalcode%3E%3C%2Fpostalcode%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

我建議你到你的陣列$xmlarray分割成塊,也許500或5000塊大小。

然後對每個這些塊執行curl請求。嘗試將結果放入文件時,使用FILE_APPENDfile_put_contents,否則將爲每個塊覆蓋該文件。

+0

你的解決方案讓我從5000個用戶到13000個用戶。除此之外,我還能做些什麼來讓它達到5萬用戶? –

+0

@ Sky21.86嘗試將塊大小從5增加到10我認爲,還有,你把$結果放在文件中的位置?在循環或外部循環內? –