php 图像数据压缩 ob_gzhandler 无效
php image data compress with ob_gzhandler not working
当我尝试将 readfile
与 ob_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 文件是否有原因?
当我尝试将 readfile
与 ob_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 文件是否有原因?