curl_multi_exec()使用太多内存

时间:2017-06-20 09:38:41

标签: php xml symfony curl

我有一个脚本,它使用下面的脚本通过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()使用的内存最多! / p>

对我来说,克服这个问题最好的方法是什么?任何帮助都非常感谢!提前谢谢。

修改

试图将我的$ 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 - 仅针对2位用户的示例$ xmlarray

  

接受编码:   的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%3Ccountrycode%3E%3C%2Fcountrycode%3E%3Cmetrocode%3E%3C%2Fmetrocode%3E%3Cpostalcode%3E%3C%2Fpostalcode%3E%3Cgender %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

1 个答案:

答案 0 :(得分:1)

我建议你将数组$xmlarray分成块大小为500或5000块。

然后对每个块执行curl请求。尝试将结果放入文件时,将FILE_APPENDfile_put_contents一起使用,否则将覆盖每个块的文件。