【问题标题】:php image data compress with ob_gzhandler not workingphp图像数据压缩与ob_gzhandler不工作
【发布时间】:2018-09-11 07:09:13
【问题描述】:

当我尝试将readfileob_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 安装后一切正常,其他网站数据正常输出。只有压缩的图像大小调整器不起作用。

【问题讨论】:

    标签: php zlib image-compression


    【解决方案1】:

    我认为您看到的错误编码问题与您直接调用 ob_gzhandler() 的事实有关。它不打算直接调用。如果需要查看是否支持 ob_gzhandler 可以测试like this:

    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 文件是否有原因?

    【讨论】:

    • 是的,在为我工作之前带有标题的解决方案,谢谢。实际上我想尝试图像压缩,看看它是否最适合我的情况,结果是否定的:) 压缩将图像加载时间从 80 毫秒增加到 160 毫秒 2 倍
    【解决方案2】:

    您可能需要一个内容编码标头

    header('Content-Encoding: gzip');

    否则,您将发送 gzip 数据,告诉浏览器“只是一个图像”,所以它试图绘制“只是图像”而不是先解压缩

    这是一个类似的相关帖子:PHP Manual GZip Encoding

    【讨论】:

    • 我已经设置了标题
    猜你喜欢
    • 2010-12-29
    • 1970-01-01
    • 2012-04-26
    • 1970-01-01
    • 2018-11-19
    • 2012-04-08
    • 2013-08-21
    • 1970-01-01
    • 2017-08-29
    相关资源
    最近更新 更多