Чтение URL-адреса с помощью PHP-скрипта приводит к увеличению ответа в X5 раз, чем в браузере.

Я пытаюсь использовать Cryptsy API по этой ссылке: http://pubapi.cryptsy.com/api.php?method=orderdatav2

Когда я захожу туда в своем браузере, я получаю ответ размером 236,2 КБ.

Когда я использую php с curl/fopen/file_get_contents и создаю запрос GET, я получаю 1,2 миллиона ответов с теми же данными! (что занимает гораздо больше времени для загрузки).

Я попытался скопировать точные заголовки, но все равно получил те же результаты.

Я подозреваю, что это потому, что браузер использует gzip, а php нет?

Любые другие варианты? Я гоняюсь за своим хвостом с этим.

Вопрос в том, что вызывает это?


person Yoni Hassin    schedule 30.05.2014    source источник
comment
Я предполагаю, что сжатие HTML?   -  person    schedule 30.05.2014
comment
Скорее всего в компрессии разница, да. Почему бы вам просто не взглянуть на поток необработанных данных, тогда вы это знаете? Просто используйте сетевой сниффер или отладочный прокси.   -  person arkascha    schedule 30.05.2014
comment
У вас есть обе загрузки. Сравните их.   -  person Andy Lester    schedule 30.05.2014
comment
@AndyLester Нет, это ни о чем не говорит. Сжатые данные будут распакованы, результат должен быть тем же. Это цель сжатия без потерь.   -  person arkascha    schedule 30.05.2014
comment
Посетите URL-адрес с помощью браузера. Выделить все/копировать. Вставьте в текстовый редактор. Сохранить файл. Размер файла 1,2 МБ.   -  person James    schedule 30.05.2014
comment
@Yoni Hassin, если вы используете Firefox + Firebug, вы можете увидеть, была ли сжата обслуживаемая страница, просмотрев вкладку «Сеть» и ее заголовки (кодирование содержимого: gzip или подобное)   -  person    schedule 30.05.2014


Ответы (2)


Причина в том, что ваш браузер отправляет следующий заголовок Accept-Encoding: gzip, deflate.

Сервер проверяет наличие этого заголовка, а затем сжимает вывод с помощью gzip.

Ваш браузер получает содержимое и при необходимости распаковывает его.

CURL по умолчанию нет. Вы можете изменить это с помощью этого кода:

curl_setopt($ch,CURLOPT_ENCODING , "gzip");

Также обратите внимание, что эта опция заботится обо всем процессе. Вам не нужно настраивать собственный Accept-Encoding заголовок или выполнять распаковку. Вам не нужно с этим справляться.

Больше информации:

http://www.php.net/manual/en/book.curl.php

http://en.wikipedia.org/wiki/HTTP_compression

http://betterexplained.com/articles/how-to-optimize-your-site-with-gzip-compression/

person Christian Gollhardt    schedule 30.05.2014

На самом деле curl_setopt($ch,CURLOPT_ENCODING, "gzip"); не работал для меня.

Решение, которое я нашел, написано здесь php - Получить сжатое содержимое с помощью cURL

$ch = curl_init("http://games2k.net/");
curl_setopt($ch,CURLOPT_ENCODING , "");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$output = curl_exec($ch);
curl_close($ch);
echo $output;

Вы были правы насчет gzip :)

person Yoni Hassin    schedule 30.05.2014
comment
Странно, должно работать с gzip. Согласно инструкции: If an empty string, "", is set, a header containing all supported encoding types is sent. - person Christian Gollhardt; 31.05.2014