【问题标题】:curl_multi_exec() using too much memorycurl_multi_exec() 使用太多内存
【发布时间】:2017-06-20 09:38:40
【问题描述】:

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

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

编辑

尝试将我的 $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%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&test=0

【问题讨论】:

  • 您可以分批运行这些请求,每批可以包含 5000 个用户。
  • @DileepKumar,我相信这正是我正在做的 - 每个请求应该包含更少 - 500 个用户。在这种情况下,我担心的是,如果每个请求中有 500 个用户 curl_multi_exec() 一次运行 10 个连接,而如果是 50000 个用户 - 它正在运行 100 个连接!我希望我能正确理解您的建议!
  • 你用的是哪个版本的php?
  • PhP 版本 7.0.15。刚刚将批次的大小从 5 更改为 10,但它仍然在 curl_multi_exec() 上崩溃。将数据放入文件中更适合我验证输出。一旦收到数据,它就会被解析并填充到数据库中!
  • $url 在您的代码中在哪里初始化?另外,您可以在数组$xmlarray 中添加一些示例吗?

标签: php xml symfony curl


【解决方案1】:

我建议您将数组 $xmlarray 拆分为可能 500 或 5000 大小的块。

然后为这些块中的每一个执行您的 curl 请求。尝试将结果放入文件时使用FILE_APPENDfile_put_contents,否则文件将被每个块覆盖。

【讨论】:

  • 您的解决方案让我从 5000 个用户增加到 13000 个用户。我还能做些什么来让它达到 5 万用户?
  • @Sky21.86 尝试将块大小从 5 增加到 10 我想,还有,你把 $result 放在哪里?内循环还是外循环?
猜你喜欢
  • 2015-06-18
  • 2010-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
  • 1970-01-01
相关资源
最近更新 更多