代码之家  ›  专栏  ›  技术社区  ›  Armen

PHP图像数据压缩,ob_gzhandler不工作

  •  1
  • Armen  · 技术社区  · 6 年前

    当我试图使用 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 回复  |  直到 6 年前
        1
  •  1
  •   Michael Powers    6 年前

    我认为你看到的错误编码问题与你打电话的事实有关 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文件有什么原因吗?

        2
  •  0
  •   Barry Carlyon    6 年前

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

    header('content-encoding:gzip');

    否则,您发送的是gzip的数据,您告诉浏览器“只是一个图像”,因此它试图绘制“只是图像”,而不是先取消压缩

    以下是类似的相关帖子: PHP Manual GZip Encoding .