定时生成静态文件,可否?
index.html 比index.php优先读取

解决方案 »

  1.   

    在开始之前,要保证你的 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 "\x1f\x8b\x08\x00\x00\x00\x00\x00"; // 计算长度和 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); 

    } ?> 
      

  2.   

    TO, ArcCreator,对于产生html的做法,我的看法是,如果在查询很多的时候,我是指所要查询的值不同的时候(比如说有很多不同文章的时候),会不会产生大量的tmp html?这样做会不会影响性能.还有就是如何控制文件更新的周期,以达到满足动态发布页面的效果(比如说对页面发布的时间有要求,新数据在半小时,一小时,或者立即发布新页面).
    这个方案我考虑过,不过我觉得还不算是性能最佳的方案.  我倾向于在系统中划一片共享内存,保存这些页面.不过不知道是否可行,如何管理?也许要依靠于第三方软件.上面WXPQD说的zlib数据压缩的技术,可以和生成tmp html的方法结合,这样会比较好吧.还有什么好建议吗?
      

  3.   

    有一篇关于使用PEAR缓冲页面的.http://www.phpe.net/articles/281.shtml, http://www.phpe.net/articles/282.shtml,我看了看.有两个问题,1、怎么安装和使用PEAR,跟平台有关吗?我想要一个可以在不同环境下都正常工作的库.2、具体效果怎么样?  希望大家也去看看。  使用过的人请多指点指点。
      

  4.   

    http://www.phpe.net/articles/366.shtml你看看这编文章吧!应该对你有帮助的。
      

  5.   

    看这篇,pear的cache_lite教程,俺正在用,很好用的说
    http://www.devshed.com/Server_Side/PHP/PHP_Cache_Lite/page1.html
      

  6.   

    To allkill(傲气游): 你知道SQUID?我对动态缓存那部分感兴趣. 还有反向代理,我不太懂那个.  你能不能多说说其原理.
    To Volca, Thanx,不过就是看不懂.呵呵,有空再慢慢来查单词了。
      

  7.   

    这么多高深的技术啊,可惜俺都不懂。
        俺的思路是在服务器端缓存“访客请求的”页面内容,通过一定的命名规则存放在某个目录下。当next one 访问这一页时首先去寻找是否有缓存页。
        对于数据库驱动的大型站点,这可以避免反复的从数据库的二进制类型字段中读取大量数据(通常数据库是不堪此重负而罢工或者造成web服务器(指IIS或Apache软件)罢工)。
        对于缓存的时效问题。有两种考虑:一种是设置过期时间,比如10分钟后重新读取数据;另一种是在数据库数据更新时主动去更新缓存文件。相信其中的利弊很容易理解。
        对于大量的查询,比如按某种条件检索网站所有文章,这个缓存是比较头大的。我曾经想过根据检索条件缓存查询结果,不过这通常在条件不会很复杂的情况下适用。比如查询所有标题包含“BabyStudio”的文章。
        缓存的应用需要有一定的取舍。它是用时效换速度的。采用物理文件缓存,需要关注的是当产生大量的缓存文件时会造成文件夹遍历的开销,所以要指定一个清理的策略。
      

  8.   

    To babystudio(ABabyStudio) "对于大量的查询,比如按某种条件检索网站所有文章,这个缓存是比较头大的",我想可能对于这种查询需要分情况而定,对于文章来说,一、如果查询重复的几率大(像某种热点,mp3,美女啊),但是内容多,那建议只缓存id 和 标题, 二、重复几率不大的,当然没有必要缓存了。对于,“缓存的时效问题”和“采用物理文件缓存,需要关注的是当产生大量的缓存文件时会造成文件夹遍历的开销,所以要指定一个清理的策略”,这两个问题就是不好处理。  我也想不到一个很好的方案,况且我总觉得放在内存中,效率要高很多。 而且我想复杂度很差不多吧。
      

  9.   

    没从其他方面考虑,我仅仅从数据库方面考虑一下(讨论性,欢迎K我...) 我用MYSQL这个数据库做假设  我们建立两台MYSQL数据库服务器  Web_mysql 和Lan_mysql  Web_mysql仅允许本机连接,lan_mysql则允许外部连接  当我们对查询页面进行submit的时候 请求被发往web_mysql 我们先检测lan_mysql是否有我们需要的数据(HEAP格式表)
     若没有,我们则对Web_mysql产生查询,查询的结果为ID,以及页面上要显示的相关数据
     我们将这些数据入lan_mysql库,这样的话基本上所有的请求基本是先决于lan_mysql
     
     感觉就是用了一个数据库服务器进行数据缓冲...(使用临时表) 相当与每查询一次我们从数据库中抽出这些数据建立个字集的记录, 没做过缓冲查询记录方面的,仅仅说说自己的一点想法.
      

  10.   

    用动态生成静态确实是比较好的解决办法。问题是操作起来十分麻烦。曾经听一个老兄说过,如果你能做出像新浪一样的新闻系统价值是在十万员以上。TO fish21cn (阿飞) Squid是一个代理软件。如果你真的很想了解squid,可以到http://www.squid-cache.org/看看,上面有详细的文档。你在http://www.squid-cache.org首先你看到的第一句号就是Squid is... a full-featured Web proxy cache
      

  11.   

    对于数据库方面我这样做:
    比如有一个php文件中有很多查询
    1、事实上,如果每次页面刷新都需要查询的话,那就太浪费了
    我们可以将某次查询的结果存到缓存中,然后我们可以确定一个规则,比如某表没有更新过,那么下一次再次有这样的查询的时候,我们就不进行该查询,而直接从缓存中读取数据。
    至于怎么知道有没有更新过,可以在每次运新更新语句的时候,产生一个临时文件,然后通过判断该临时文件的属性,就可以知道需不需要更新了。
    这个规则也可以是不同的,不如以时间期限为规则,该临时文件一过期,我们就进行查询,否则从缓存中取
    2、to  fish21cn(阿飞) ,只要按一定规则对缓存库进行文件夹划分,比如以时间为规则把一定时间内的缓存文件放到一定的文件夹中就可以的,这样再多的数据也不会有文件夹遍历而效率降低。
    3、我们不只可以对页面、查询进行缓存,也可以对class及函数调用的结果、动态产生的图像等进行缓存;而缓存的载体不仅可以用文件,也可以用数据库,当然直接放在内存中最快。以上这些实现的方法在PEAR::Cache中都有,当然PEAR::Cache_Lite更加使用和快速。
    4、通过代码实现的缓存技术虽然有一定价值,但是如果用proxy cache这样的东西,我想性能上会提高得更多而且更直接,对有钱的大公司来说绝对是第一选择。
      

  12.   

    还有to sports98() ,你的方法绝对ok,只是这个临时表的设计真的要很花心思
    我不知道设计成仅仅有id和value两个字段的表是不是就可以了呢?待考
      

  13.   

    http://www.eaoo.com/design/show.asp?id=95http://www.eaoo.com/design/show.asp?id=112http://www.eaoo.com/design/show.asp?id=113http://www.eaoo.com/design/show.asp?id=234 看看这几篇文章
      

  14.   

    转贴:简单的页面缓冲技术前言  
      其实说它为技术,也许不能说是真正的技术。这只不过是我自已想出来的页面处理的方法,当然与别人的想法可能是一致的。不过我还是想给它一个好听的名字。那么我这里所指的页面缓冲是什么呢?就是指将动态生成的页面保存起来,供下一次的使用。这样下一次访问它可能就不需要动态生成了。就象提供了一个cache 一样。在我的网站上,也许你的网站也是如此,使用了象模板之类的技术,这样用户所看到的页面就是动态生成的。但是一个页面对于你是这样,对于别人可能还是这样,即在一段时间内是不会变化的,如果将上次生成的结果直接返回给下一次访问的用户不是更好吗?减少了生成时间,效率要高一些。我想随着网站的发展,速度与效率问题还是要考虑的。这里我给出我的实现,希望对大家有所帮助。只是一个思路,没有具体的实现。  使用条件  
      是不是所有的网页最好都使用呢?我想不需要,而且也不可能。之所以能缓冲就是因为下一次访问与上一次访问的内容可能是完全一样的。所以对于经常变化的页面就不合适了。比如页面上要显示计数信息的就不太合适。还有就是如果你的动态页面输出时,没有先输出到变量中,而是直接返回给用户,如使用echo,print ,readfile之类的输出,我个人认为现在还作不到。因为无法将输出结果得到,保存到文件中去(反正我是想了半天没有想出有什么可以将直将输出的东西截下来,重定向到文件中去)。那么比较适的动态页面的处理就是:输出结果应该可以放到一个字符串之中。所以使用条件就是:  页面基本不会变化  动态页面的处理结果可以存放到字符串中    这样使用模板类来处理动态页面就很好了。通过在模板中设置可替换的变量,然后根据实际的值替换相应的模板中的变量,同时可以将结果放到字符串中进行输出,这种模板类的处理非常适合保存处理后的页面。当然不使用模板类,也可以通过字符串的处理来生成输出结果也是可行的。至于怎么做就不讨论了。  实现  
      如前所述,不是一个真正的实现,而是一个实现的思路。    处理流程:  根据访问的要求,生成缓冲文件名  查看文件名是否存在,如果文件不存在,则生成动态页面,将页面保存,同时输出结果,结束;如果存在,则执行第3步  统计文件的修改时间,及与动态页面生成有关的文件的修改时间  比较缓冲文件的修改时间与其它页面的修改时间,如果其它页面修改时间大于缓冲文件修改时间,认为动态结果可能会发生变化,则重新生成动态页面结果,保存到文件中,且输出结果,结束;否则执行第5步  说明缓冲文件最新,则直接输出缓冲文件    这就是我的处理。至于缓冲文件如何保存,可以建一个临时目录也可以使用数据库处理。如果使用了数据库则判断文件是否最新的方式也应作变化,比如在数据库中增加生成时间字段,比较这个时间字段与其它文件的修改时间即可。方法大家自已想。   
        我的具体实现的例子  
      为了帮助大家有个感性认识,这里我给出在我的主页上实现的基于文件处理的方法。只有主要的处理代码,不完整。  
    <?  
    1 $tmpfile="../tmp/".basename($REQUEST_URI);  
    2 $tmpfile=str_replace("?", "_", $tmpfile);  
    3 $tmpfile=str_replace("&", "_", $tmpfile);  
    4 if(file_exists($tmpfile))  
    5 {  
    6 $cflag=false;  
    7 $dtmp=filemtime($tmpfile);  
    8 $itmp=filemtime($incfile);  
    9 $cflag=$cflag | ($dtmp < $itmp);  
    10 $ctmp=filemtime(basename($PHP_SELF));  
    11 $cflag=$cflag | ($dtmp < $ctmp);  
    12 $ttmp=filemtime("template/content.ihtml");  
    13 $cflag=$cflag | ($dtmp < $ttmp);  
    14 }  
    15 else  
    16 $cflag=true;  
    17  
    18 if(!$cflag) //使用存在的文件  
    19 {  
    20 readfile($tmpfile);  
    21 exit;  
    22 }  
    23  
    24 //创建新的文件  
    25 include "template.class.php3";  
    26  
    27 $fp=fopen($incfile, "r");  
    28 $content=fread($fp, filesize($incfile));  
    29 fclose($fp);  
    30  
    31 //下面进行模版处理  
    32 $t = new Template("template", "keep");  
    33  
    34 $t->set_file("contentfile","content.ihtml");  
    35  
    36 $t->set_var(  
    37 array(  
    38 "content"=>$content  
    39 ));  
    40  
    41 $t->parse("outputcontent","contentfile");  
    42  
    43 $fp=fopen($tmpfile, "w");  
    44 if($fp)  
    45 {  
    46 flock($fp, 3);  
    47 fwrite($fp, $t->get_var("outputcontent"));  
    48 flock($fp, 1);  
    49 fclose($fp);  
    50 }  
    51 $t->p("outputcontent");  
    ?>  
      先向大家介绍一下我的目录结构:  
      /---bin/ 执行程序目录  
      | |--content.php3 用于处理文件显示的程序  
       | |--template/ 用于存放模板文件的目录  
       | |---content.ihtml 模板文件  
       |-docs/ 数据文件  
       |-tmp/ 存放缓冲文件   
    content.php3文件用来处理动态页面。用户可以通过content.php3?page=id号来读出一个数据文件。具体方法我就不说了,大家只要知道每个数据文件都有一个不同的id号,这样content.php3?page=id号的方式就可以唯一标识一个数据文件。  第1-3行,生成临时文件名。将'?','&'等字符替换成'_'。  
    第4行,判断临时文件名是否存在,如果有则执行第18-22行,并结束。  
    第6-13行,判断与生成动态页面有关的文件修改时间与临时文件哪个更新,设置重新生成标志。在这里使用  filemtime()来得到最后修改时间。  
    第24-41行,利用模板类生成动态结果,放在变量中。关于模板的处理可以参考《模板,PHPLIB处理方式》一文。  
    第43-50行,生成临时文件。此处对文件进行了加锁处理,以象写冲突。  
    第51行,输出结果。    这就是我的处理,大家可以自行修改。    缓冲是一项有意义的技术,可以提高访问速度,减少系统消耗。不过方法可能有多种多样,大家可以自由发挥。
      

  15.   

    http://www.eaoo.com/design/list.asp?classid=2&Nclassid=9
      

  16.   

    啊,Squid还是不看。好像只能运行于Unix下也。我想找一个跨平台的东西。好像Apache自己都带有Cache Proxy。