php 图像数据压缩 ob_gzhandler 无效

php image data compress with ob_gzhandler not working

当我尝试将 readfileob_gzhandler 一起使用时,我进入浏览器:

Content Encoding Error

我的密码是

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安装好一切正常,其他网站数据正常输出。只有压缩图像缩放器不工作。

您可能需要内容编码header

header('Content-Encoding: gzip');

否则,您发送的是 gzip 压缩数据,您告诉浏览器是 "just an image",因此它尝试绘制 "just the image" 而不是先解压缩

这里有一个类似的相关post:PHP Manual GZip Encoding.

我认为您遇到的 mis-encoding 问题与您直接调用 ob_gzhandler() 这一事实有关。它不打算直接调用。如果你需要查看是否支持 ob_gzhandler 你可以测试 like this:

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

进行更改后,Content-Type header 得到修复,图像显示正确。不过内容并没有压缩出来。

看来,如果在启动输出缓冲区后发送 Content-Type: image/png header,它会导致 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 文件是否有原因?