Сжатие данных изображений php с не работает ob_gzhandler - PullRequest
0 голосов
/ 11 сентября 2018

Когда я пытаюсь использовать readfile с ob_gzhandler, я получаю в браузере:

Ошибка кодирования содержимого

мой код

function enableCompression()
{
    $ok = ob_gzhandler('', PHP_OUTPUT_HANDLER_START);
    if ($ok === FALSE) {
        return FALSE; // not allowed
    }

    if (function_exists('ini_set')) {
        ini_set('zlib.output_compression', 'Off');
        ini_set('zlib.output_compression_level', '6');
    }
    ob_start('ob_gzhandler', 1);
    return TRUE;
}

enableCompression(); //returns TRUE

$file = "pathto/default.png";
$info = @getimagesize($file);
header('Content-type: ' . $info['mime']);

readfile($file);
exit;

Когда я комментирую header('Content-type: ' . $info['mime']); строку, я вижу такие данные изображения в браузере

�PNG IHDR��J�TPLTE�� ސ�������������ؑ�������� vvv����� 䀀 �� .... "

Я что-то не так делаю? Возможно ли?сжать данные изображения с помощью ob_gzhandler?

PS: zlib установлен все работает, другие данные сайта обычно выводятся. Не работает только средство изменения размера сжатого изображения.

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Я думаю, что проблема неправильного кодирования связана с тем, что вы звоните ob_gzhandler() напрямую.Он не предназначен для прямого вызова.Если вам нужно проверить, поддерживается ли ob_gzhandler, вы можете проверить следующим образом :

if(!ob_start('ob_gzhandler')) {
    die('ob_gzhandler not supported');
}

. После этого изменения заголовок Content-Type был исправлен и изображение отображалось правильно.Однако содержимое не было сжато.

Похоже, что если вы отправляете заголовок Content-Type: image/png после запуска буфера вывода, это приводит к тому, что ob_gzhandler не сжимает буфер вывода.Это сработало для меня:

header('Content-type: image/png');
ob_start('ob_gzhandler');
readfile('test.png');
ob_end_flush();

Хотя это не сработало:

ob_start('ob_gzhandler');
header('Content-type: image/png');
readfile("test.png");
ob_end_flush();

При этом, как правило, плохая идея сжать файлы PNG (или JPEG, GIF и т. Д.)поскольку они уже сжаты и, вероятно, не могут быть сжаты намного лучше.Есть ли причина, по которой вы пытаетесь дважды сжать файл PNG?

0 голосов
/ 12 сентября 2018

Вам может понадобиться заголовок с кодировкой содержимого

header ('Content-Encoding: gzip');

В противном случае вы отправляете данные в формате gzip, которыеВы говорите, что браузер "просто изображение", поэтому он пытается сначала нарисовать "просто изображение", а не разархивировать

Вот похожий пост: PHP Manual GZip Encoding .

...