Почему curl_multi_getcontent получил частичное тело - PullRequest
0 голосов
/ 12 апреля 2019

Я забираю данные о некоторых продуктах из какого-то интернет-магазина. Когда я использую curl_multi для каждого URL-адреса продуктов, он получает parzial hmlt body. (для некоторых URL ... не для всех) Примерно 10% из 15k URL получают половину данных

Я пытался установить неограниченную память для моего apache xampp, но проблема не устранена (начинают получать не полностью данные после 7k URL-адресов, так как перед обновлением памяти они теряли данные после 3k-URL)

url: PHP curl_multi_getcontent получено частичное тело

но я не понял ответа.

ожидаемый контент должен быть всем <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);*/
...