Задать вопрос
@9StarRu

Как в общий метод отправки cURL добавить возможность multi curl запросов?

Как в общий метод отправки cURL добавить возможность multi curl запросов, точнее переписать на multi curl, т.к. при отправке одного url он отработает как обычный.

Вот мой имеющийся метод отправки cURL

// Общий метод для отправки запросов через curl

    private function request($type, $url, $data = [], $headers = [], $curlopts = [])
    {
        $default_headers = [
            'Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
            'Accept-Encoding:gzip, deflate, lzma',
            'Accept-Language:ru-RU,ru;q=0.8,en-US;q=0.6,en;q=0.4',
            'Upgrade-Insecure-Requests:1',
            'User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36 OPR/42.0.2393.517'
        ];

        $default_curlopts = [
            //CURLOPT_INTERFACE => '46.254.16.170',
            CURLOPT_URL => (strpos($url, 'https://') === 0 ? '' : 'https://site.ru') . $url . ($type == 'GET' && count($data) > 0 ? '?' . http_build_query($data) : ''),
            CURLOPT_HTTPHEADER => array_merge($default_headers, $headers),
            CURLOPT_FOLLOWLOCATION => false,
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_HEADER => true,
            CURLOPT_ENCODING => 'gzip',
            CURLOPT_COOKIEFILE => $this->auth_cookie_file,
            CURLOPT_COOKIEJAR => $this->auth_cookie_file,
            CURLOPT_FOLLOWLOCATION => true
        ];

        if ($type == 'POST') {
            $default_curlopts[CURLOPT_POST] = true;
            $default_curlopts[CURLOPT_POSTFIELDS] = http_build_query($data);
        }

        curl_setopt_array($this->ch, array_replace($default_curlopts, $curlopts));

        sleep($this->sleep_time);
        $response = (string)curl_exec($this->ch);

        $result = [
            'http_code' => curl_getinfo($this->ch, CURLINFO_HTTP_CODE),
            'raw_response' => $response,
            'header_size' => curl_getinfo($this->ch, CURLINFO_HEADER_SIZE)
        ];

        $result['header'] = mb_substr($response, 0, $result['header_size'], 'UTF-8');
        $result['headers'] = array_filter(array_map('trim', explode("\n", $result['header'])));
        $result['body'] = mb_substr($response, $result['header_size'], null, 'UTF-8');

        return $result;
    }


Это мой multi curl

// Todas url gravadas em array
$urls = [
"https://site.ru",
"https://site2.ru"
];

// Setando opção padrão para todas url e adicionando a fila para processamento
$mh = curl_multi_init();

foreach($urls as $key => $url) {
$ch[$key] = curl_init();
curl_setopt($ch[$key], CURLOPT_URL, $url);
curl_setopt($ch[$key], CURLOPT_RETURNTRANSFER, TRUE);
curl_multi_add_handle($mh, $ch[$key]);
}

// Executando consulta
do {
  curl_multi_exec($mh, $running);
  curl_multi_select($mh);
} while ($running > 0);

// Obtendo dados de todas as consultas e retirando da fila
foreach(array_keys($ch) as $key){

                $content = curl_multi_getcontent($ch[$key]);

                $results[$key] = $content;
 
                curl_multi_remove_handle($mh, $ch[$key]);

}

// Finalizando
curl_multi_close($mh);

var_dump($content);


Пробовал самостоятельно доработать метод, но не разобрался.

Спасибо!
  • Вопрос задан
  • 73 просмотра
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы