M.A*_*hmi 13 php compression encoding gzip
我用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
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
如果我将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
Run Code Online (Sandbox Code Playgroud)
我不太关心压缩,因为我想知道为什么它不起作用.
干杯,
Cra*_*ton 12
好吧,我认为这是因为你试图压缩一个空字符串.
我把你的脚本放在你的脚本上,并在FF和IE中运行它.
两者都失败了,FF说有一个问题(就像你描述的那样).
但是,我注意到$ data是一个空字符串.
当我$data = "Some test data.";在文件的顶部设置它立即工作(浏览器显示"一些测试数据."),并检查Firebug,我可以看到正确的标题.
Content-Encoding gzip
Content-Length 68
Vary Accept-Encoding
Content-Type text/html
Run Code Online (Sandbox Code Playgroud)
编辑:另外,只是要指出,你 if ($supportsGzip) {有点奇怪,因为你的其他条件实际应该回应$data,而不是$content.
编辑:好的,根据您上面修改的功能,有两个关键问题.
主要问题与您通过调用消除标题这一事实有关ob_end_clean().对PHP Docs的评论指出"ob_end_clean()确实丢弃了标题".
这意味着您在调用之前设置的任何标题都ob_end_clean()将被删除.此外,您修改的函数也不会发送gzip编码标头.
我必须说,这里甚至可能不需要使用ob_start和相关函数.请尝试以下方法:
function _compress( $data ) {
$supportsGzip = strpos( $_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip' ) !== false;
if ( $supportsGzip ) {
$content = gzencode( trim( preg_replace( '/\s+/', ' ', $data ) ), 9);
header('Content-Encoding: gzip');
} else {
$content = $data;
}
$offset = 60 * 60;
$expire = "expires: " . gmdate("D, d M Y H:i:s", time() + $offset) . " GMT";
header("content-type: text/html; charset: UTF-8");
header("cache-control: must-revalidate");
header( $expire );
header( 'Content-Length: ' . strlen( $content ) );
header('Vary: Accept-Encoding');
echo $content;
}
_compress( "Some test data" );
Run Code Online (Sandbox Code Playgroud)
这适用于IE和FF,但我没有时间测试其他浏览器.
如果您真的必须使用ob_start及相关功能,请确保在致电后设置标题ob_end_clean().
我建议使用http://php.net/manual/de/function.ob-gzhandler.php,这对我来说是开箱即用的:
在我的index.php中,我只是将它放在一些输出之前:
/**
* Enable GZIP-Compression for Browser that support it.
*/
ob_start("ob_gzhandler");
Run Code Online (Sandbox Code Playgroud)
它编码了!
| 归档时间: |
|
| 查看次数: |
26700 次 |
| 最近记录: |