怎么样把网页压缩输出?100分!!!
像ipb论坛怎么做的gzip压缩输出网页内容?
在网上找到这篇文章,但是看不懂,能注释一下给我看看吗,谢谢大家~~
<?
ob_start();
ob_implicit_flush(0);
function GetHeader()
{
$headers = getallheaders();
while (list($header, $value) = each($headers))
{
$Message .= "$header: $value<br>\n";
}
return $Message;
}
function CheckCanGzip()
{
global $HTTP_ACCEPT_ENCODING, $PHP_SELF, $Wget, $REMOTE_ADDR, $S_UserName;
if (connection_timeout() || connection_aborted()){
return 0;
}
if ((strpos('catoc'.$HTTP_ACCEPT_ENCODING, 'gzip')) || $Wget == 'Y')
{
if (strpos('catoc'.$HTTP_ACCEPT_ENCODING, 'x-gzip'))
{
$ENCODING = "x-gzip";
$Error_Msg = str_replace('<br>','',GetHeader());
$Error_Msg .= "Time: ".date("Y-m-d H:i:s")."\n";
$Error_Msg .= "Remote-Address: ".$REMOTE_ADDR."\n";
//mail('[email]your@none.net[/email]', "User have x-gzip output in file $PHP_SELF!!!", $Error_Msg);
}else
{
$ENCODING = "gzip";
}
return $ENCODING;
}
else
{
return 0;
}
}
function GzDocOut()
{
global $PHP_SELF, $CatocGz, $REMOTE_ADDR, $S_UserName;
$ENCODING = CheckCanGzip();
if ($ENCODING)
{
print "\n<!-- Use compress $ENCODING -->\n";
$Contents = ob_get_contents();
ob_end_clean();
if ($CatocGz == 'Y')
{
print "Not compress lenth: ".strlen($Contents)."<BR>";
print "Compressed lenth: ".strlen(gzcompress($Contents))."<BR>";
exit;
}else
{
header("Content-Encoding: $ENCODING");
}
print pack('cccccccc',0x1f,0x8b,0x08,0x00,0x00,0x00,0x00,0x00);
$Size = strlen($Contents);
$Crc = crc32($Contents);
$Contents = gzcompress($Contents);
$Contents = substr($Contents, 0, strlen($Contents) - 4);
print $Contents;
print pack('V',$Crc);
print pack('V',$Size);
exit;
}else
{
ob_end_flush();
$Error_Msg = str_replace('<br>','',GetHeader());
$Error_Msg .= "Time: ".date("Y-m-d H:i:s")."\n";
$Error_Msg .= "Remote-Address: ".$REMOTE_ADDR."\n";
//mail('[email]your@none.net[/email]', "User can not use gzip output in file $PHP_SELF!!!", $Error_Msg);
exit;
}
}
?>
问题点数:100、回复次数:4Top
1 楼feel8(Max.H)回复于 2003-09-02 19:29:46 得分 50
上面的太长了,俺简化的
<?
//gzdoc.php
ob_start();
ob_implicit_flush(0);
function GzDocOut(){
$gziplevel=9;
$ENCODING = "gzip";
$Contents = ob_get_contents();
$Contents .= "\n<!-- Use compress $ENCODING -->\n";
ob_end_clean();
header("Content-Encoding: $ENCODING");
print pack('cccccccc',0x1f,0x8b,0x08,0x00,0x00,0x00,0x00,0x00);
$Size = strlen($Contents);
$Crc = crc32($Contents);
$Contents = gzcompress($Contents,$gziplevel);
$Contents = substr($Contents, 0, strlen($Contents) - 4);
print $Contents;
print pack('V',$Crc);
print pack('V',$Size);
exit;
}
?>
<?php
//test.php
include_once("./gzdoc.php");
echo "test";
GzDocOut();
?>
还有一个函数形式的。
function gzipOutput($text,$level=1){
$returntext=$text;
$encoding = false;
if (function_exists("crc32") and function_exists("gzcompress") ){
if (strpos(" ".$_SERVER['HTTP_ACCEPT_ENCODING'],"x-gzip")) {
$encoding = "x-gzip";
}
if (strpos(" ".$_SERVER['HTTP_ACCEPT_ENCODING'],"gzip")) {
$encoding = "gzip";
}
if ($encoding) {
header("Content-Encoding: $encoding");
$size = strlen($text);
$crc = crc32($text);
$returntext = "\x1f\x8b\x08\x00\x00\x00\x00\x00";
$returntext .= substr(gzcompress($text,$level),0,-4);
$returntext .= pack("V",$crc);
$returntext .= pack("V",$size);
}
}
return $returntext;
}
转贴一篇文章:
在开始之前,要保证你的 PHP4 编译时支持 Zlib。
首先,初始化输出缓冲:
<?php
ob_start();
ob_implicit_flush(0);
?>
然后产生所有的输出内容。
<?php
print("本例为压缩输出!");
?>
页面生成以后,采用:
<?php
$contents = ob_get_contents();
ob_end_clean();
?>
还要检查浏览器是否支持压缩数据,我们采用在变量 $HTTP_ACCEPT_ENCODING 中检查 "gzip, deflate"的办法:
<?php
if(ereg('gzip, deflate',$HTTP_ACCEPT_ENCODING)) {
// 产生 gzip 后的内容
} else {
echo $contents;
}
?>
下面我们分析怎样产生 gzip 输出:
<?php
// 告诉浏览器下面接收的是 gzip 数据。
header("Content-Encoding: gzip");
// 显示 gzip 文件的文件头
// 只要一次就够了
echo "x1fx8bx08x00x00x00x00x00";
// 计算长度和 CRC 校验码
$Size = strlen($contents);
$Crc = crc32($contents);
// 压缩数据
$contents = gzcompress($contents, 9);
// 不能直接在这里输出内容,因为还没有写入 CRC 呢!
$contents = substr($contents, 0, strlen($contents) - 4);
echo $contents;
gzip_PrintFourChars($Crc);
gzip_PrintFourChars($Size);
function gzip_PrintFourChars($Val) {
for ($i = 0; $i < 4; $i ++) {
echo chr($Val % 256);
$Val = floor($Val / 256);
}
}
?>
Top
2 楼winodbc()回复于 2003-09-02 21:22:38 得分 0
谢谢楼上!!Top
3 楼pcre(最强ZJ)回复于 2003-09-02 21:26:03 得分 0
这样输出,服务器需不需要什么支持才能用?Top
4 楼feel8(Max.H)回复于 2003-09-02 21:30:55 得分 50
<?php
phpinfo();
?>
里面看HTTP_ACCEPT_ENCODING gzip, deflate 这样估计就可以了。具体不清楚。Top




