次のスクリプトを使用して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
これらの要求はバッチで実行でき、各バッチには5000ユーザーが含まれます。 –
@DileepKumar、私はこれがまさに私がやっていることだと思います。各リクエストにはさらに500人以下のユーザーが含まれているはずです。この場合の私の懸念は、それぞれの要求で500人のユーザがcurl_multi_exec()で10の接続を実行しているのに対し、50000のユーザでは100の接続を実行していることです。私はあなたの提案を正しい方法で理解することを願っています! –
あなたはどのバージョンのPHPを使用していますか? –