Ошибка при gzuncompress

Статус
В этой теме нельзя размещать новые ответы.

dandandan

Мой дом здесь!
Регистрация
7 Авг 2008
Сообщения
1.036
Реакции
292
Переношу сайты на другой хостинг (в США). Возникла проблема. Страницы с текстом, хранящиеся в gzip не открываются с помощью
PHP:
$file=file_put_contents($put_do_fila);
$text=gzuncompress(stripslashes($file));
echo $text;
Получаю ошибку
Warning: gzuncompress() [function.gzuncompress]: data error in /......dex.php on line 102

На старом бывшем хостинге mchost и дома на компе все открывается. Пробовал перезакачивать файлы - проблема не ушла.
 
фаилы в UTF-8?
- я бы проверил кодировку
- потом бы попытался прочитать фаил и выдать на страницу дамп
- если дам есть то значит внутри проблема
- может где есть 1 лишний символ до начала упаковки то тогда будет ошибка
- может с буфферизацией проблема

вот пример как у меня работает
мой класс
<?php
/**
* $Revision: 11 $
* $Author: CrashX $
* $Date: 2010-02-02 14:27:01 +0600 (Вт, 02 фев 2010)$
* $Id: gzip.php 11 2010-02-02 08:52:10Z CrashX $
* Copyright © CrashX <XSiteCMS@gmail.com>
* Всі права захищено © CrashX
*/
if(!defined('_SHELL')) die();

/* Класс GZip (сжатия страниц) */
class GZip {
var $version=0.02;

//BEGIN class ZIP
var $encoding=false;
var $data='';
var $size='';
var $crc32='';
var $http_encoding=false;

/**
* Конфигурация определение поддержки GZip браузером и сервером
* @return boolean
*/
function config() {
if(GZIP && (isset($_SERVER['HTTP_ACCEPT_ENCODING']) || isset($_SERVER['HTTP_TE']) ):(
if(headers_sent() || connection_aborted():(
return false;
endif;
if(isset($_SERVER['HTTP_ACCEPT_ENCODING']):(
$this->http_encoding=$_SERVER['HTTP_ACCEPT_ENCODING'];
elseif(isset($_SERVER['HTTP_TE']):(
$this->http_encoding=$_SERVER['HTTP_TE'];
endif;
if(strpos($this->http_encoding,'x-gzip') !== false:(
$this->encoding="x-gzip";
endif;
if(strpos($this->http_encoding,'gzip') !== false:(
$this->encoding="gzip";
endif;
if(extension_loaded('zlib') && $this->encoding:(
ob_start();
ob_implicit_flush(0);
return true;
endif;
endif;

return false;
}

/**
* Сжатия данных
* @param string данные для сжатия
* @return string
*/
function compress($page) {
if(GZIP:(
if($this->encoding && function_exists("gzcompress"):(
$this->data=ob_get_contents();
if((strpos($_SERVER['HTTP_USER_AGENT'], "MSIE 5")>0 || strpos($_SERVER['HTTP_USER_AGENT'], "MSIE 6.0")>0) && strpos($_SERVER['HTTP_USER_AGENT'], "Opera")===false:(
$this->data=str_repeat(" ", 2048)."\r\n".$this->data;
endif;
ob_end_clean();
$this->data.=$page;
$this->crc32=crc32($this->data);
$this->data=gzcompress($this->data,GZIP);
$this->size=strlen($this->data);
$this->data=substr($this->data,0,$this->size-4);
header("Content-Encoding: ".$this->encoding);
header("Content-Length: ".$this->size);
echo "\x1f\x8b\x08\x00\x00\x00\x00\x00";
echo $this->data;
echo pack('V',$this->crc32);
echo pack('V',$this->size);
echo "\n<!-- Use ".$this->encoding." compress ".GZIP." -->";
echo "\n<!-- Not compress length: ".strlen($page)." -->";
echo "\n<!-- Compressed length: ".$this->size." -->";
exit();
endif;
endif;
return $page;
}

}
//END class GZIP
?>

пример
//если GZip включен
if(GZIP:( //GZIP степень сжатия если 0 то выкл
//загрузка класса GZip, его инициализация и конфигурирование
$engine->extend($engine->gzip);
$engine->gzip->config();
$engine->gzip->compress($engine->template->result['template']);

//$engine->template->result['template'] - это все данные подлежашие упаковке
endif;
echo $engine->template->result['template'];
$engine->template->unload();
$engine->template->clear('template');
exit();
 
Кодировка всего сp1251. Архивиование делалось дома, надо только извлечь данные.

Самое прикольное - создал отдельную папку и забросил туда файл для разархивирования и создал маленький скриптик - все работает пучком. А в скрипте а той же строке - ошибка.
 
если не сложно валожи скрипт, тут подправим))
так если я правильно понял это кеш в гзип?
или ты отдаешь страничку в Гзип упаковывая ее?
или что лучше выложи скрипты и пару фаилов и все)
 
Лежит страничка в гзип (для уменьшения размера файлов). Скриптом обращаюсь к этой странице.
Делаю $text=file_get_contents('путь до файла') .
Затем $text=gzuncompress(strip_slashes($text));
И затем если упрощенно echo $text;

В результате ругается на gzuncompress - пишет данные файла повреждены.
Сам скрипт полность отлажен, так что ошибок быть не должно. Сейчас на локалхосте разЗипил все файлы и закинул незаархивированные и убрал функцию gzuncompress.

Техподдержка хостинга предложила мне обратиться к разрабочку. :) т.е. мне самому к самому себе :).
 
хотя бы 1 фаил сжаты приложи.. посмотреть для того можно ли заменить на говотовое решение с zip
еще скачай с хоста и сравни по байтово фаилы если различаются то тогда нужно к хостеру писать, тк у меня был такой хостер у когорого можно было только в 1 папку бинарные фаилы складывать

Добавлено через 32 минуты
1
$file=file_put_contents($put_do_fila);
$text=gzuncompress(stripslashes($file));
echo $text;
ЭТО СОХРАНИТЬ! а не ЧИТАТЬ!!!!!

2

// <= PHP 5
$file = file_get_contents('./people.txt', true);
// > PHP 5
$file = file_get_contents('./people.txt', FILE_USE_INCLUDE_PATH);

Добавлено через 35 минут
--
вот работает вот так
$file = 'test.htm';
$current = file_get_contents(stripslashes(trim($file)),FILE_USE_INCLUDE_PATH);
$text=gzuncompress($current);
echo $text;
trim нужно бы делать тоже для того что бы в конце отсеь перенос если тот есть... тк например когда я сохраняю то дописываю еще \n\r

еще напиши как сохраняешь, именно код напиши
 
Вечером код примера архива сброшу. file_get_contents - как раз прочитать.

Архивируемые данные получаются и принимаю функциями
Код:
function load_array_dump($filename) {
$content = file_get_contents($filename);
eval(‘$array=’.gzuncompress(stripslashes($content)).’;');
return($array);
}

function save_array_dump($filename, $array) {
$dump = addslashes(gzcompress(var_export($array,true),9));
file_put_contents($filename, $dump);
}

p.s. Еще раз повторяю, что код полностью рабочий на старом хостинге и на локалхосте все отлично пахало. В данном примере могут быть маленькие косячки, т.к. это не прямоскопированный код из моего скрипта.
p.s.s. Архивирование используется только для уменьшения размера файлов при хранении на хостинге.
 
Вечером код примера архива сброшу. file_get_contents - как раз прочитать.

Архивируемые данные получаются и принимаю функциями
Код:
function load_array_dump($filename) {
$content = file_get_contents($filename);
eval(‘$array=’.gzuncompress(stripslashes($content)).’;');
return($array);
}

function save_array_dump($filename, $array) {
$dump = addslashes(gzcompress(var_export($array,true),9));
file_put_contents($filename, $dump);
}
p.s. Еще раз повторяю, что код полностью рабочий на старом хостинге и на локалхосте все отлично пахало. В данном примере могут быть маленькие косячки, т.к. это не прямоскопированный код из моего скрипта.

Может у тебя eval не срабатывает? попробуй так:
PHP:
function load_array_dump($filename) {
$content = file_get_contents($filename);
return gzuncompress(stripslashes($content));
}
 
попробуй как вариант поработать всемто export c dump и с буфферами, попробуй сериализовать и тп

на каждом шагде делай print_r и ищи где косяк...

PHP:
function load_array_dump($filename=null) {
$content = file_get_contents($filename,FILE_USE_INCLUDE_PATH);
//eval('$array='.gzuncompress(stripslashes($content)).';');
// не пойму зачем eval? если нужно просто присвоить то это можно и так сделать!
$array=unserialize(gzuncompress(stripslashes($content)));
// если это массив то
//$array=array();
//$array=gzuncompress(stripslashes($content));
return($array);
}
function save_array_dump($filename, $array) {

// не вижу смысла в функции var_export
//$dump = addslashes(gzcompress(var_export($array,true),9));
  $dump=addslashes(gzcompress(serialize($array),9));
  /*
   * ob_start();
var_dump($my_variable);
$my_string = ob_get_contents();
ob_end_clean();
   *
   */
file_put_contents($filename, $dump);
}
 
Вечером переправил все скрипты, чтобы без gzuncompress работали. Все пашет. Всем спасибо. Тему можно закрывать.
 
Статус
В этой теме нельзя размещать новые ответы.
Назад
Сверху