Я вызываю конечную точку REST в PHP, используя cURL для получения некоторых данных JSON:
<?php $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($ch); echo $result; curl_close($ch);
Для получения данных с использованием приведенного выше кода на моем localhost требуется 2,5 секунды. Тот же код занимает около 7,5 секунд при запуске на реальном сервере. Когда URL-адрес открывается непосредственно в браузере, он занимает всего 1,5 секунды.
Мой вопрос: почему требуется, чтобы cURL извлекал данные на реальном сервере и как я могу решить эту проблему?
Ниже приведен вывод curl_getinfo($ch)
на сервере:
Array ( [content_type] => application/json [http_code] => 200 [header_size] => 420 [request_size] => 113 [filetime] => -1 [ssl_verify_result] => 0 [redirect_count] => 0 [total_time] => 7.305496 [namelookup_time] => 0.150378 [connect_time] => 0.473187 [pretransfer_time] => 0.473237 [size_upload] => 0 [size_download] => 1291504 [speed_download] => 176785 [speed_upload] => 0 [download_content_length] => -1 [upload_content_length] => 0 [starttransfer_time] => 1.787901 [redirect_time] => 0 [redirect_url] => [certinfo] => Array ( ) [primary_port] => 80 [local_port] => 53962 )
Я нашел решение своей проблемы. Как я уже упоминал в вопросе, служба загружала самую быструю версию в браузерах. Итак, я проверил «Заголовки запроса» запроса на вкладке «Сеть» в Google Chrome Inspector. Я скопировал эти заголовки и использовал их в моем запросе cURL в PHP. После очистки этих заголовков я обнаружил, что все, что мне нужно сделать, это добавить заголовок Accept-Encoding
. Я передал значение gzip
так:
curl_setopt($ch, CURLOPT_ENCODING, 'gzip');
но также работает его пустая строка.
curl_setopt($ch, CURLOPT_ENCODING, '');
Согласно руководству php.net для CURLOPT_ENCODING:
Содержимое заголовка «Accept-Encoding:». Это позволяет декодировать ответ. Поддерживаемые кодировки – это «личность», «дефляция» и «gzip». Если задана пустая строка «", загорается заголовок, содержащий все поддерживаемые типы кодирования.
$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "set ur url"); curl_setopt($ch, CURLOPT_ENCODING , "gzip"); curl_setopt($ch, CURLOPT_ENCODING, ''); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch);
Проверьте этот пример.