科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道应用软件用PHP控制您的浏览器cache

用PHP控制您的浏览器cache

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

Output Control 函数可以让你自由控制脚本中数据的输出。

作者:ok520 来源:blog 2007年10月21日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
一、 静态模版技术

  简介:所谓静态模版技术就是通过某种方式,使得用户在client端得到的是由PHP产生的html页面。如果这个html页面不会再被更新,那么当另外的用户再次浏览此页面时,程序将不会再调用PHP以及相关的数据库,对于某些信息量比较大的网站,例如sina,163,sohu。类似这种的技术带来的好处是非常巨大的。

  我所知道的实现静态输出的有两种办法:

  <1>.通过y10k修改的phplib的一个叫template.inc.php类实现。

  <2>.使用ob系列函数实现。

  对于第一种方法,因为不是这篇文章所要研究的问题,所以不再赘述。

  我们现在来看一看第二种方法的具体实现:

  Example 4.

<?php
ob_start();//打开缓冲区
?>

  php页面的全部输出

<?
$content = ob_get_contents();//取得php页面输出的全部内容
$fp = fopen(“output00001.html”, “w”); //创建一个文件,并打开,准备写入
fwrite($fp, $content); //把php页面的内容全部写入output00001.html,然后……
fclose($fp);
?>

  这样,所谓的静态模版就很容易的被实现了……

  二、 捕捉输出

  以上的Example 4.是一种最简单的情况,你还可以在写入前对$content进行操作……

  你可以设法捕捉一些关键字,然后去对它进行再处理,比如Example 3.所述的PHP语法高亮显示。个人认为,这个功能是此函数最大的精华所在,它可以解决各种各样的问题,但需要你有足够的想象力……

  Example 5.

<?
Function run_code($code) {
 If($code) {
  ob_start();
  eval($code);
  $contents = ob_get_contents();
  ob_end_clean();
 }else {
  echo “错误!没有输出”;
  exit();
 }
 return $contents;
}

  以上这个例子的用途不是很大,不过很典型$code的本身就是一个含有变量的输出页面,而这个例子用eval把$code中的变量替换,然后对输出结果再进行输出捕捉,再一次的进行处理……

  Example 6. 加快传输

<?
/*
** Title.........: PHP4 HTTP Compression Speeds up the Web
** Version.......: 1.20
** Author........: catoc <catoc@163.net>
** Filename......: gzdoc.php
** Last changed..: 18/10/2000
** Requirments...: PHP4 >= 4.0.1
** PHP was configured with --with-zlib[=DIR]
** Notes.........: Dynamic Content Acceleration compresses
** the data transmission data on the fly
** code by sun jin hu (catoc) <catoc@163.net>
** Most newer browsers since 1998/1999 have
** been equipped to support the HTTP 1.1
** standard known as "content-encoding."
** Essentially the browser indicates to the
** server that it can accept "content encoding"
** and if the server is capable it will then
** compress the data and transmit it. The
** browser decompresses it and then renders
** the page.
**
** Modified by John Lim (jlim@natsoft.com.my)
** based on ideas by Sandy McArthur, Jr
** Usage........:
** No space before the beginning of the first '<?' tag.
** ------------Start of file----------
** |<?
** | include('gzdoc.php');
** |? >
** |<HTML>
** |... the page ...
** |</HTML>
** |<?
** | gzdocout();
** |? >
** -------------End of file-----------
*/
ob_start();
ob_implicit_flush(0);
function CheckCanGzip(){
 global $HTTP_ACCEPT_ENCODING;
 if (headers_sent() || connection_timeout() || connection_aborted()){
  return 0;
 }
 if (strpos($HTTP_ACCEPT_ENCODING, 'x-gzip') !== false) return "x-gzip";
 if (strpos($HTTP_ACCEPT_ENCODING,'gzip') !== false) return "gzip";
 return 0;
}
/* $level = compression level 0-9, 0=none, 9=max */
function GzDocOut($level=1,$debug=0){
 $ENCODING = CheckCanGzip();
 if ($ENCODING){
  print "n<!-- Use compress $ENCODING -->n";
  $Contents = ob_get_contents();
  ob_end_clean();
  if ($debug){
   $s = "<p>Not compress length: ".strlen($Contents);
   $s .= "
   Compressed length: ".strlen(gzcompress($Contents,$level));
   $Contents .= $s;
  }
  header("Content-Encoding: $ENCODING");
  print "x1fx8bx08x00x00x00x00x00";
  $Size = strlen($Contents);
  $Crc = crc32($Contents);
  $Contents = gzcompress($Contents,$level);
  $Contents = substr($Contents, 0, strlen($Contents) - 4);
  print $Contents;
  print pack('V',$Crc);
  print pack('V',$Size);
  exit;
 }else{
  ob_end_flush();
  exit;
 }
}
?>

  这是catoc的一段很早以前的代码,是在weblogs.com看到的,他利用了zlib的函数,对传输的内容进行了压缩,测试表明,对于10k以上的页面,会产生效果,而且页面越大,效果越明显……

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章