爱问知识人 爱问教育 医院库

控制PHP的输出:缓存并压缩动态页面

首页

控制PHP的输出:缓存并压缩动态页面


        

提交回答
好评回答
  • 2023-03-06 13:30:00
      mod_gzip是一个Apache模块,其功能是使用Gzip压缩静态的html页面,遵循IETF标准的浏览器可以接受gzip编码(IE, Netscape等)。mod_gzip可以将页面的下载时间提高4-5倍。我强烈建议你在你的web服务器上使用mod_gzip。
      然而,我们还必须用PHP建立我们自己的压缩引擎。在这篇文章里,我将要介绍如何使用PHP的输出控制函数来大幅加速页面载入速度。介绍PHP的输出控制函数PHP4中最令人满意的事是——你可以让PHP缓存所有由脚本生成的输出,在你决定把它们送出之前,浏览器方是不会收到任何内容的。
      在脚本程序中你能用这些函数来设置header、cookies,然而这只是强大的输出函数的一小部分功能。代码如下:
    告诉PHP处理器把所有的输出重定向到一个内部的缓存(buffer)中。在调用ob_start之前,没有输出会被送到浏览器去。
      代码如下:
    该函数将“输出缓存”(output buffer)以字符串的形式返回。你可以调用该函数把积累下来的输出送到浏览器中。(仅在把buffering功能关闭之后!)代码如下:
    返回缓存中的字符串的长度。
      代码如下:
    清空输出缓存,并将输出缓存关闭。在缓存中的内容输出到浏览器之前,必须使用这个函数。
    void 501([int flag])
    用来打开/关闭隐含的flush动作开关(默认是关)。
      如果flush是开的,每次调用print/echo或是其它输出命令的时候,输出的内容会被立即送到浏览器端。使用输出控制来压缩PHP输出
    你必须使用PHP4里编译的Zlib扩展包来压缩输出。如果需要的话,可以查看PHP文档中有关Zlib包的安装指导。
      
    首先,初始化输出缓存:代码如下:
    之后,用print, echo, 或其他你喜欢的方法生成所有输出内容,例如:代码如下:
    页面生成后,我们取回输出内容:代码如下:
    之后,必须检测浏览器是否支持压缩数据。
      如果支持,浏览器会发给服务器端一个ACCEPT-ENCODEING HTTP头。我们只需检查$HTTP_ACCEPT_ENCODING变量中是否有“gzip,deflate”字串。代码如下:
    这种方法使用起来既简单又结构清晰。
      下面让我们看看如何生成压缩的输出:代码如下:
    //显示gzip文件的头
    //只需显示一次
    echo "x1fx8bx08x00x00x00x00x00";//计算出文件的大小和CRC码
    $Size = strlen($contents);
    $Crc = crc32($contents);//压缩数据
    $contents = gzcompress($contents, 9);//我们不能就这样输出,因为CRC码是混乱的。
      
    //如果我在这里使用“echo $contents”,压缩的数据会被送出。
    //但是却不完整。文件最后的四个字节是CRC校验码,可是只发出去了三个字节。
    //最后一个字节被丢掉了。
      我不知道这个bug在4。0。2版中解决了没有。
    //不过最好避免错误的方法是把正确的CRC校验码加到压缩的数据的末尾。
    //
    //把旧的CRC校验码剥离
    $contents = substr($contents, 0, strlen($contents) - 4);//仅显示压缩的数据
    echo $contents;//输出CRC,和原来数据的大小(字节)
    gzip_PrintFourChars($Crc);
    gzip_PrintFourChars($Size);function gzip_PrintFourChars($Val) {
    for ($i = 0; $i?>
    //好了,你还可以按此方式附加上更多的压缩数据。
      要想进行实际的测试,所有的脚本代码如下:代码如下:
    print("I'm compressed!n");$contents = ob_get_contents();
    ob_end_clean();header("Content-Encoding: gzip");echo "x1fx8bx08x00x00x00x00x00";$Size = strlen($contents);
    $Crc = crc32($contents);$contents = gzcompress($contents, 9);$contents = substr($contents, 0, strlen($contents) - 4);echo $contents;gzip_PrintFourChars($Crc);
    gzip_PrintFourChars($Size);function gzip_PrintFourChars($Val) {
    for ($i = 0; $i缓存PHP输出当PHP4还没问世,我不得不使用PHP3的时候,我对开发一些缓存机制来减少数据库的载入、对文件系统的存取十分感兴趣。
      在PHP3中没有什么特别好的方法,但是有了输出缓存之后,在PHP4中一切变得容易多了。
    这有一个简单的例子:代码如下:
    if((!file_exists("/cache/$cached_file"))||(!is_valid("/cache/$cached_file"))) {
    //is_valid函数验证缓存,你可以用这个函数检查Cache是否过期或其他特定的条件。
      
    //如果文件不在Cache中或者不可用则生成输出
    ob_start();
    ob_implicit_flush(0);
    //在此输出……$contents = ob_get_contents();
    ob_end_clean();
    $fil=fopen($cached_file,"w+");
    fwrite($fil,$contents,$strlen($contents));
    fclose($fil);
    }/如果请求的文件在缓存中且可用,则:
    readfile($cached_file);?>这是一个简单的例子,使用输出缓存,你可以建立一个复杂的内容生成系统,对不同的块或程序使用不同的缓存机制,等等……结论PHP输出控制函数对把脚本生成的输出重定向到缓存中十分有用。
      为支持gzip的浏览器输出压过的缓存数据可以减少载入时间。也可作为缓存机制来减少对数据源的存取(数据库或文件),这对使用XML意义重大。
    如果我们用PHP建立一个引擎,缓存从数据源得到的数据(xml文档和数据库),并且动态的生成XML格式的内容(没有外观-presentation)我们可以得到这些XML的输出,并使用XSLT转换成任意一种我们想要的外观格式(html, wap, palm, pdf等)。
      使用PHP4的输出缓存和Sablotron XSLT扩展可以很好地完成这个任务。

    w***

    2023-03-06 13:30:00

类似问题

换一换
  • 电脑/网络 相关知识

  • 电脑网络技术
  • 电脑网络

相关推荐

正在加载...
最新资料 推荐信息 热门专题 热点推荐
  • 1-20
  • 21-40
  • 41-60
  • 61-80
  • 81-100
  • 101-120
  • 121-140
  • 141-160
  • 161-180
  • 181-200
  • 1-20
  • 21-40
  • 41-60
  • 61-80
  • 81-100
  • 101-120
  • 121-140
  • 141-160
  • 161-180
  • 181-200
  • 1-20
  • 21-40
  • 41-60
  • 61-80
  • 81-100
  • 101-120
  • 121-140
  • 141-160
  • 161-180
  • 181-200
  • 1-20
  • 21-40
  • 41-60
  • 61-80
  • 81-100
  • 101-120
  • 121-140
  • 141-160
  • 161-180
  • 181-200

热点检索

  • 1-20
  • 21-40
  • 41-60
  • 61-80
  • 81-100
  • 101-120
  • 121-140
  • 141-160
  • 161-180
  • 181-200
返回
顶部
帮助 意见
反馈

确定举报此问题

举报原因(必选):