gpt4 book ai didi

PHP 手动 GZip 编码

转载 作者:行者123 更新时间:2023-12-03 00:01:37 25 4
gpt4 key购买 nike

我正在使用 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

我不再关心是否进行压缩,而是想知道为什么它不起作用。

干杯,

最佳答案

嗯,我认为这是因为你试图压缩一个空字符串。

我按照你提供的脚本获取了它,并在 FF 和 IE 中运行它。

都失败了,FF 说存在问题(就像您所描述的那样)。

但是,我随后注意到 $data 是一个空字符串。

当我在文件顶部设置 $data = "Some test data."; 时,它立即起作用(浏览器显示“Some test data.”),并在 Firebug 中检查,我可以查看正确的标题。

Content-Encoding    gzip
Content-Length 68
Vary Accept-Encoding
Content-Type text/html

编辑: 另外,只是指出,您的 if ($supportsGzip) { 有点奇怪,因为您的 else 条件实际上应该回显 $数据,而不是$content

编辑:好的,根据您上面修改后的函数,有两个关键问题。

主要问题与您通过调用 ob_end_clean() 删除 header 这一事实有关。对 PHP Docs 的评论声明“ob_end_clean() 确实丢弃 header ”。

这意味着您在调用 ob_end_clean() 之前设置的任何 header 都将被删除。此外,您修改后的函数也不会发送 gzip 编码 header 。

我必须说,这里可能甚至不需要使用 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" );

这适用于 IE 和 FF,但我没有时间测试其他浏览器。

如果您确实必须使用 ob_start 和相关函数,请确保在调用 ob_end_clean() 后设置 header 。

关于PHP 手动 GZip 编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5699020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com