【发布时间】:2011-08-07 15:03:30
【问题描述】:
我正在使用 Page Speed 测试我的网站,结果大约是 70/100。启用压缩是减慢速度的第一个也是最重要的因素。
我知道我可以通过修改 php.ini 来自动执行此操作,但我对手动方法更感兴趣 (gzencode)。
问题是所有浏览器都无法打开网站(Firefox:“您尝试查看的页面无法显示,因为它使用了无效或不受支持的压缩形式。”,Chrome:“303,ERR 内容编码”等)或者它们显示编码的字符串。
Live Headers 显示浏览器接受编码,并且响应设置了内容类型,但仍然失败。
GET / HTTP/1.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding: gzip,deflate
HTTP/1.1 200 OK
Content-Encoding: gzip
Content-Length: 5827
Vary: Accept-Encoding
private function _compress($data) {
//return trim(preg_replace(array('/\>[^\S ]+/s','/[^\S ]+\</s','/(\s)+/s'), array('>','<','\\1'), $data));
$supportsGzip = strpos($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip') !== false;
ob_start();
if ($supportsGzip) {
echo gzencode(trim(preg_replace('/\s+/', ' ', $data)), 9);
} else {
echo $data;
}
$content = ob_get_contents();
header("content-type: text/html; charset: UTF-8");
header("cache-control: must-revalidate");
$offset = 60 * 60;
$expire = "expires: " . gmdate("D, d M Y H:i:s", time() + $offset) . " GMT";
header($expire);
header('Content-Length: ' . strlen($content));
header('Vary: Accept-Encoding');
ob_end_clean();
echo $content;
}
如果我将 Content-Encoding 更改为 zlib,我会得到编码字符串:
‹������ÕZÿsÛ¶ÿW^‘¥²o‘¨/–-Ë–ÚØ‰_Ôµ•õÚ_v I°I‚!A©j–Öºnçÿb·»%ÍÚë²nëå?‘þ›=€¤L)’,ÛIw>ŸEâxïáƒ÷°ùÞ½O¶Ÿï߇Žtlؼµ·» $kŸ•¶ ã^ã<܃•\¾� Ÿº—\¸Ô6ŒûŽ”^Õ0z½^®WÊ ¿m4ÅjŰ…XÎ’©Ã¦ænS·]#ÌÕF-|8LRPL²ìIÈ»5²-\É\™mô=FÀŒJ5"Ù—RóÝ�³Cý€ÉZ([ÙŠb%¹´YýÑãáîcx}±iD´˜¿KV#4”á§x>¬°à®íÒ ãpÅËæî1øÌ®‘@öm
我不再关心压缩,而是想知道它为什么不起作用。
干杯,
【问题讨论】:
-
如果
$supportsGzip不应该Content-Length是压缩内容的长度吗? -
@Fanis,contents 保存缓冲区的内容,取决于 $supportsGzip 的编码或纯文本。
-
奇怪,如果您使用 ob_gzhandler() 而不是滚动自己的压缩包装器,您会得到相同的行为吗?
-
@user687976 你说得对,我在寻找 $data 时设法错过了那一行。实际上,正如@Craig Sefton 在他的回答中提到的那样,这可能是问题吗? $data vs $content
标签: php encoding gzip compression