PHP имеет собственную функцию для работы с архивами gzip. Я написал следующий код:
error_reporting(E_ALL);
$f = file_get_contents('http://spiderbites.nytimes.com/sitemaps/www.nytimes.com/sitemap.xml.gz');
echo $f;
$f = gzuncompress($f);
echo "<hr>";
echo $f;
Первый эхо обычно выводит сжатый файл с правильным заголовком (по крайней мере первые два байта верны). Если бы я скачал этот файл в своем браузере, я мог бы легко распаковать его.
Однако гзункомпресс брошен Warning: gzuncompress(): data error in /home/path/to/script.php on line 5
Кто-нибудь может указать мне правильное направление для решения этой проблемы?
РЕДАКТИРОВАТЬ:
Часть вывода phpinfo ()
Или вы можете просто использовать правильную функцию декомпрессии, gzdecode()
.
Обратите внимание, что gzuncompress () может не распаковывать некоторые сжатые строки и возвращать ошибку данных.
Проблема может заключаться в том, что внешняя сжатая строка имеет контрольную сумму CRC32 в конце файла, а не Adler-32, как ожидает PHP.
Это может быть вариантом того, почему это не работает.
Попробуйте с его кодом:
function gzuncompress_crc32($data) {
$f = tempnam('/tmp', 'gz_fix');
file_put_contents($f, "\x1f\x8b\x08\x00\x00\x00\x00\x00" . $data);
return file_get_contents('compress.zlib://' . $f);
}
Измените свой код в этом:
error_reporting(E_ALL);
$f = file_get_contents('http://spiderbites.nytimes.com/sitemaps/www.nytimes.com/sitemap.xml.gz');
echo $f;
$f = gzuncompress_crc32($f);
echo "<hr>";
echo $f;
Насколько я проверил локально, это больше не дает ошибки.