CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Web 开发 >  PHP

怎么样把网页压缩输出?100分!!!

楼主winodbc()2003-09-02 19:26:05 在 Web 开发 / PHP 提问

像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

相关问题

  • help,Dos 下怎么样输出语句!!!
  • 怎么样输出函数名编码???
  • link怎么样输出bin格式?
  • Dreamweaver Mx网页打印输出问题?
  • xml网页怎么样保存?
  • 怎么样改变DLL的输出文件名???
  • 怎么样把ACCESS中的数据输出到EXCEL?
  • 怎么样输出一个方便打印的文件??
  • 怎么样能直接在屏幕上输出字符
  • 用Fastreport时,怎么样实现打印输出

关键词

  • .net
  • php
  • returntext
  • gzip
  • gzcompress
  • encoding
  • crc
  • 输出
  • 压缩
  • strpos

得分解答快速导航

  • 帖主:winodbc
  • feel8
  • feel8

相关链接

  • Web开发类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo