Я пытался несколькими способами, прежде чем подумать, чтобы задать этот вопрос здесь .. ни один способ не удалось со мной … Я пытаюсь декодировать и читать данные с одного сайта, который использует gzip
Я использую локон & PHP. Когда я пытаюсь декодировать и распечатать результат, я получаю длинный список искаженных специальных символов, таких как:
JHWkdsU01EUXdWa1pXYTFOdFZsZFRiaz
VoVW14S2NGbFljRmRXYkdSWVpFZEdWRT
FYVWtoWmEyaExXVlpLTm1KR1VsWmlXR2
если я запускаю нижеприведенный скрипт PHP, я получаю сообщение об ошибке, как
PHP Warning: gzdecode(): data error in /var/www/mn.php on line 20
Вот мой текущий код:
<?
$data_string = '9999';
$ch = curl_init('http://example.com/getN.php&keyword=');
curl_setopt( $ch, CURLOPT_USERAGENT, 'Darwin/15.0.0' );
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch,CURLOPT_ENCODING , 'gzip');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_TIMEOUT,5);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); // Follow redirects
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/x-www-form-urlencoded',
'Accept-Encoding: gzip, deflate',
'Content-Length: ' . strlen($data_string))
);
$result = gzdecode ( curl_exec($ch) );
curl_close($ch);
print_r($result);
?>
Я также пытаюсь включить модуль
a2enmod deflate
/etc/init.d/apache2 restart
и включите zlib из php.ini
либо я пытаюсь проверить это напрямую
curl -sH 'Accept-encoding: gzip' http://example.com/getN.php&keyword=9999 | gunzip -
я получил тот же результат
а вот информация с сайта
HTTP/1.1 200 OK
Server: nginx
Date: Thu, 15 Oct 2015 00:41:54 GMT
Content-Type: text/html; charset=utf-8
Transfer-Encoding: chunked
Vary: Accept-Encoding
X-Powered-By: PHP/5.4.31
X-Frame-Options: SAMEORIGIN
Content-Encoding: gzip
пожалуйста помоги
Я заметил, что ваш код
curl_setopt($ch,CURLOPT_ENCODING , 'gzip');
и gzdecode()
позвони позже. Если вы получили указание принять закодированное содержимое, cURL автоматически выполнит декодирование для вас, без необходимости делать это вручную после curl_exec()
, Его возвращаемое значение уже декодируется, если вы сказали cURL принять закодированную передачу.
Тем не менее, страница, которую вы пытаетесь загрузить, может быть не закодирована с помощью gzip, а другим способом. Как указано в руководство, попробуйте указать пустую строку:
# Enable all supported encoding types.
curl_setopt($ch, CURLOPT_ENCODING, '');
Это включает все поддерживаемые типы кодирования. И не используйте gzdecode()
, Результат должен быть уже декодирован.
спасибо всем, наконец, начните работать после того, как я воспользуюсь вашим советом, удалите gzdecode и некоторые другие и сохраните заголовок в … Примите кодировку в gzip и вот окончательный код
<?
$data_string = '9999';
$ch = curl_init('http://example.com/getN.php&keyword=');
curl_setopt( $ch, CURLOPT_USERAGENT, 'Darwin/15.0.0' );
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_TIMEOUT,5);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); // Follow redirects
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/x-www-form-urlencoded',
'Accept-Encoding: gzip',
'Content-Length: ' . strlen($data_string))
);
$result = curl_exec($ch);
curl_close($ch);
print $result;
?>