为什么curl_multi_getcontent收到部分正文

时间:2019-04-12 15:33:24

标签: php curl web-scraping curl-multi

我正在从一些在线商店中删除一些产品数据。 当我每次打开产品的所有网址使用curl_multi时,它就会收到parzial hmlt body。 (某些网址...并非全部) 大约15,000个网址中有10%会收到一半的数据

我试图为我的apache xampp设置无限内存,但问题仍然存在(由于7k url之后开始接收到不完全的数据,因为在内存升级之前3k url之后它丢失了数据)

url:PHP curl_multi_getcontent partial body received

但是我不明白答案。

预期内容必须全部为<html> ... </html>内容,而不是一半。

是否有一些参数告诉curl_multi完成从url获取所有内容的操作,因为这样无法工作?


function multiRequest($urlArray)
    {

        $multi = curl_multi_init();
        $handles = [];
        $html = [];

        foreach ($urlArray as $url) {
            $ch = curl_init($url);
            curl_setopt($ch, CURLOPT_HEADER, false);
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

            curl_multi_add_handle($multi, $ch);
            $handles[$url] = $ch;
        }

        do {
            $mrc = curl_multi_exec($multi, $active);
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);

        while ($active && $mrc == CURLM_OK) {

//            var_dump(CURLM_OK);
            /** Check for results and execute until everything is done */
            if (curl_multi_select($multi) == -1) {

                /** If returns -1, wait a bit, but go forward always */
                usleep(1000);
            }

            do {
                $mrc = curl_multi_exec($multi, $active);
//                var_dump($active);
            } while ($mrc == CURLM_CALL_MULTI_PERFORM);
        }

        foreach ($handles as $id => $chanel) {
            $html[$id] = curl_multi_getcontent($chanel);
            curl_multi_remove_handle($multi, $chanel);
            curl_close($chanel);
        }

        curl_multi_close($multi);

        return $html;
    }


ini_set('memory_limit', '-1');

// $productsUrl can contain 3k urls
$productsContent = multiRequest($productsUrl);

// if divide productsUrl to chunks it works... but what point is to use culr_multi
/*$productsUrl = array_chunk($productsUrl, 25);*/

0 个答案:

没有答案