2015-10-15 6 views
1

Я пытаюсь несколькими способами, прежде чем подумать, чтобы задать этот вопрос здесь .. мне не удалось ... Я пытаюсь декодировать и читать данные с одного сайта, использующего gzip Я использую curl & php. Когда я пытаюсь расшифровать и напечатать результат, я получаю длинный список перевранные специальных символов, таких как:не удалось декодировать gzip с помощью curl 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 

пожалуйста help

+0

его трудно отлаживать это для вы, поскольку фактические данные из example.com не выглядят gzipped – chiliNUT

ответ

2

Я заметил, что ваш код имеет

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

и gzdecode() позвонить позже. Если указано, что вы принимаете закодированный контент, cURL автоматически обрабатывает декодирование, без необходимости вручную делать это после curl_exec(). Его возвращаемое значение уже декодировано, если вы сказали cURL принять кодированную передачу.

Тем не менее, страница, которую вы пытаетесь загрузить, на самом деле не может быть закодирована с помощью gzip, а другой метод. Как указано в manual, попробуйте указать пустую строку:

# Enable all supported encoding types. 
curl_setopt($ch, CURLOPT_ENCODING, ''); 

Это позволяет использовать все поддерживаемые типы кодирования. И не используйте gzdecode(). Результат должен быть уже декодирован.

+0

Я пробовал это с/без (gzip, gzdecode, Accept-Encoding: gzip/deflate) все дают мне тот же результат (длинный список искаженных специальных символы) или ошибка (PHP Предупреждение: gzdecode(): ошибка данных в номере строки) Я также копирую код gzip и пытаюсь его декодировать вручную либо не работающим ... bwt .. У меня есть сайт [link] (https://www.samltool.com/gzip.php), который они декодируют мой код gzip в Интернете без каких-либо проблем. Workwork !! , чтобы подтвердить эту проблему либо в моем коде, либо в настройках сервера. (мой сервер НЕ декодируется). –

+0

Вам не нужно устанавливать Content-Length самостоятельно.Если вы используете cURL для отправки HTTP POST, он рассчитает длину контента для вас и автоматически добавит требуемый заголовок Content-Length. Он может быть меньше, чем 'strlen ($ data_string)', если cURL сжимает содержимое. Также полностью удалите CURLOPT_HTTPHEADER и добавьте параметр CURLOPT_POST в значение true. –

0

спасибо всем ,, наконец, начать работать после того, как я принимаю ваши советы и удалить gzdecode и некоторые другие, и сохранить заголовок .. Accept Encoding в 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; 


?> 

 Смежные вопросы

  • Нет связанных вопросов^_^