我有一个脚本,通过使用下面的脚本从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
您可以批量运行这些请求,每批可以包含5000个用户。 –
@DileepKumar,我相信这正是我正在做的 - 每个请求应该包含更少 - 500个用户。在这种情况下我担心的是,如果每个请求中有500个用户curl_multi_exec()一次运行10个连接,而如果它是50000个用户 - 它将运行100个连接!我希望我能以正确的方式理解你的建议! –
你正在使用哪个版本的php? –