Как в общий метод отправки 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);
Пробовал самостоятельно доработать метод, но не разобрался.
Спасибо!