仓酷云

标题: PHP编程:深切切磋PHP缓存手艺 [打印本页]

作者: 灵魂腐蚀    时间: 2015-2-3 23:33
标题: PHP编程:深切切磋PHP缓存手艺
给你的建议是,有些最常用的语句是需要记住的 比如if for while这些、其他的一般语句你只要知道有这个函数或者有这个功能就可以了,当你用的时候你可以凭借记忆搜索就可以了。      PHP,一门比来几年衰亡的Web设计剧本言语,因为它的壮大和可伸缩性,近几年来失掉长足的开展,PHP比拟传统的ASP网站,在速度上有相对的优势,想mssql转6万条数据PHP如需求40秒,ASP不下2分钟.然而,因为网站的数据愈来愈多,咱们渴求能更疾速的挪用数据,不用要每次都从数据库失落,咱们可以从其他的中央,例如一个文件,或某个内存地址,这就是PHP的缓存手艺,也就是Cache手艺。
    剖析深切
    普通来讲,缓存的目标是把数据放在一个中央让会见的更快点,毫无疑问,内存是最快的,然而,几百M的数据能往内寄存么?这不实际,固然,有的时分一时放如办事器缓存,如ob_start()这个缓存页面开启的话在发送文件头之前页面内容都被缓存在内存中,晓得等页面输入主动清晰或守候ob_get_contents的前往,或被ob_end_clean显示的排除,这在静态页面的生成中能很好的使用,在模板中能失掉很好的表现。
    别的,在ASP中有一对象application,可以保留公用的参数,这也算点缓存,但在PHP,我至今没看到开辟者产出这类对象,切实其实,没需要.ASP.NET的页面缓存手艺就用的是viewstate,而cache就是文件联系关系,(纷歧定正确),文件被修正,更新缓存,文件没被修正并且不超时(正文1),就读取缓存,前往了局,就是这个思绪,看看这个源码:
   
    <?php
    class cache{
    /*
    Class Name: cache
    Description: control to cache data,$cache_out_time is a array to save cache date time out.
    Version: 1.0
    Author: 老农 cjjer
    Last modify:2006-2-26
    Author URL: http://www.cjjer.com
    */
    private $cache_dir;
    private $expireTime=180;//缓存的工夫是 60 秒
    function __construct($cache_dirname){
    if(!@is_dir($cache_dirname)){
    if(!@mkdir($cache_dirname,0777)){
    $this->warn('缓存文件不存在并且不克不及创立,需求手动创立.');
    return false;
    }
    }
    $this->cache_dir = $cache_dirname;
    }
    function __destruct(){
    echo 'Cache class bye.';
    }
    function get_url() {
    if (!isset($_SERVER['REQUEST_URI'])) {
    $url = $_SERVER['REQUEST_URI'];
    }else{
    $url = $_SERVER['SCRIPT_NAME'];
    $url .= (!empty($_SERVER['QUERY_STRING'])) ? '?' . $_SERVER['QUERY_STRING'] : '';
    }
    return $url;
    }
  ----------------------------------
   
    function warn($errorstring){
    echo "产生毛病:
  ".$errorstring."
";
    }
    function cache_page($pageurl,$pagedata){
    if(!$fso=fopen($pageurl,'w')){
    $this->warns('没法翻开缓存文件.');//trigger_error
    return false;
    }
    if(!flock($fso,LOCK_EX)){//LOCK_NB,排它型锁定
    $this->warns('没法锁定缓存文件.');//trigger_error
    return false;
    }
    if(!fwrite($fso,$pagedata)){//写入字撙节,serialize写入其他格局
    $this->warns('没法写入缓存文件.');//trigger_error
    return false;
    }
    flock($fso,LOCK_UN);//释放锁定
    fclose($fso);
    return true;
    }
    function display_cache($cacheFile){
    if(!file_exists($cacheFile)){
    $this->warn('没法读取缓存文件.');//trigger_error
    return false;
    }
    echo '读取缓存文件:'.$cacheFile;
    //return unserialize(file_get_contents($cacheFile));
    $fso = fopen($cacheFile, 'r');
    $data = fread($fso, filesize($cacheFile));
    fclose($fso);
    return $data;
    }
    function readData($cacheFile='default_cache.txt'){
    $cacheFile = $this->cache_dir."/".$cacheFile;
    if(file_exists($cacheFile)&&filemtime($cacheFile)>(time()-$this->expireTime)){
    $data=$this->display_cache($cacheFile);
    }else{
    $data="from here wo can get it from mysql database,update time is ".date('l dS \of F Y h:i:s A').",过时工夫是:".date('l dS \of F Y h:i:s A',time()+$this->expireTime)."----------";
    $this->cache_page($cacheFile,$data);
    }
    return $data;
    }
    }
    ?>
   
    上面我打断这个代码逐行注释
   
    法式透析
    这个缓存类(类没甚么好怕的.请持续看)称号是cache,有2个属性:
    private $cache_dir;
  private $expireTime=180;
    $cache_dir是缓存文件所放的绝对网站目次的父目次, $expireTime(正文一)是咱们缓存的数据过时的工夫,次要是这个思绪:
    当数据或文件被加载的时分,先判别缓存文件存在不,前往false ,文件最初修正工夫弛缓存的工夫和比以后工夫大不,大的话申明缓存还没到期,小的话前往false,当前往false的时分,读取原始数据,写入缓存文件中,前往数据。接着看法式:
   
    function __construct($cache_dirname){
    if(!@is_dir($cache_dirname)){
    if(!@mkdir($cache_dirname,0777)){
    $this->warn('缓存文件不存在并且不克不及创立,需求手动创立.');
    return false;
    }
    }
    $this->cache_dir = $cache_dirname;
    }
   
    当类第一次被实例的时分机关默许函数带参数缓存文件称号,如文件不存在,创立一个有编纂权限的文件夹,创立掉败的时分抛出异常.然后把cache类的 $cache_dir属性设置为这个文件夹称号,咱们的一切缓存文件都是在这个文件夹上面的.
   
    function __destruct(){ echo 'Cache class bye.'; }
    这是class类的析构函数,为了演示,咱们输入一个字符串暗示咱们释放cache类资本胜利.
      function warn($errorstring){
     echo "<b><font color='red'>产生毛病:<pre>".$errorstring."</pre></font></b>";
     }
   
    这个办法输入毛病信息:
   
    function get_url() {
    if (!isset($_SERVER['REQUEST_URI'])) {
    $url = $_SERVER['REQUEST_URI'];
    }else{
    $url = $_SERVER['SCRIPT_NAME'];
    $url .= (!empty($_SERVER['QUERY_STRING'])) ? '?' . $_SERVER['QUERY_STRING'] : '';
    }
    return $url;
    }
   
    这个办法前往以后url的信息,这是我看国外良多人的cms体系如许做,次要是缓存x.PHP?page=1,x.PHP?page=2,等这类文件的,这里列出是为了扩大的这个cache类功效的。
  function cache_page($pageurl,$pagedata){
  if(!$fso=fopen($pageurl,'w')){
   $this->warns('没法翻开缓存文件.');//trigger_error
   return false;
  }
  if(!flock($fso,LOCK_EX)){//LOCK_NB,排它型锁定
   $this->warns('没法锁定缓存文件.');//trigger_error
   return false;
  }
  if(!fwrite($fso,$pagedata)){//写入字撙节,serialize写入其他格局
   $this->warns('没法写入缓存文件.');//trigger_error
   return false;
  }
  flock($fso,LOCK_UN);//释放锁定
  fclose($fso);
  return true;
}
   
    cache_page办法分离传入的是缓存的文件称号和数据,这是把数据写到文件里的办法,先用fopen翻开文件,然后挪用句柄锁定这个文件,然后用fwrite写入文件,最初释放这个句柄,任何一步产生毛病将抛失足误. 您能够看到这个正文:
    写入字撙节,serialize写入其他格局,特地一提的是假如咱们要把一个数组,(可以从MySQL数据库外面select查询除的了局)用serialize函数写入,用unserialize读取到本来的类型。
   
    function display_cache($cacheFile){
    if(!file_exists($cacheFile)){
    $this->warn('没法读取缓存文件.');//trigger_error
    return false;
    }
    echo '读取缓存文件:'.$cacheFile;
    //return unserialize(file_get_contents($cacheFile));
    $fso = fopen($cacheFile, 'r');
    $data = fread($fso, filesize($cacheFile));
    fclose($fso);
    return $data;
    }
   
    这是由文件称号读取缓存的办法,直接翻开文件,读取全体,假如文件不存在的或没法读取的话前往false,固然,你感应不人道的话,可以从头生成缓存.
  function readData($cacheFile='default_cache.txt'){
  $cacheFile = $this->cache_dir."/".$cacheFile;
  if(file_exists($cacheFile)&&filemtime($cacheFile)>(time()-$this->expireTime)){
   $data=$this->display_cache($cacheFile);
   }else{
    $data="from here wo can get it from mysql database,update time is <b>".date('l dS \of F Y h:i:s A')."</b>,过时工夫是:".date('l dS \of F Y h:i:s A',time()+$this->expireTime)."----------";
    $this->cache_page($cacheFile,$data);
  }
   return $data;
}
   
    这个函数是咱们挪用的办法,可以写成接口的办法,由传入参数判别文件存在不,文件最初修正工夫+expireTime的工夫是否是过了以后工夫(大于的话申明没有过时),假如文件不存在或已过时,从头加载原始数据,这里,为了复杂时代,咱们是直接源是字符串,您可以把cache类承继某类,取到数据库的数据.(正文2)
    增补申明 结语
    正文一:这个缓存的工夫您可以本人调,可以依据工夫情形读取数组,xml,缓存等,请依照您的便利,值得一提的是缓存的工夫(也就是缓存的key)也用缓存掌握,.这在cms体系中被普遍利用,他们把要更新的key放在缓存中,十分轻易掌握全战。
    正文二:PHP5入手下手撑持类承继,这是让人高兴的,把网站全局歇息写在一个设置装备摆设的类外面,再写与数据层交互的类(如与MySQL交互的类),咱们的这个cache类承继数据交互的类,可以十分轻易的读取数据库,这是外话,此处不再睁开,有工夫和人人详谈。
熟悉HTML/CSS/JS等网页基本元素,完成阶段可自行制作完整的网页,对元素属性达到熟悉程度
作者: 只想知道    时间: 2015-2-4 02:06
基础有没有对学习php没有太大区别,关键是兴趣。
作者: 谁可相欹    时间: 2015-2-7 15:00
环境搭建好,当你看见你的浏览器输出“it works\\\\\\\"时你一定是喜悦的。在你解决问题的时候,我强烈建议多读php手册。
作者: 老尸    时间: 2015-2-7 17:56
不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。
作者: 金色的骷髅    时间: 2015-2-8 07:46
不禁又想起那些说php是草根语言的人,为什么认得差距这么大呢。
作者: 乐观    时间: 2015-2-25 01:06
其实没啥难的,多练习,练习写程序,真正的实践比看100遍都有用。不过要熟悉引擎
作者: 小魔女    时间: 2015-3-7 14:51
刚开始安装php的时候,我图了个省事,把php的扩展全都打开啦(就是把php.ini 那一片 extension 前面的冒号全去掉啦),这样自然有好处,以后不用再需要什么功能再来打开。
作者: 飘飘悠悠    时间: 2015-3-15 07:36
其实也不算什么什么心得,在各位大侠算是小巫见大巫了吧,望大家不要见笑,若其中有错误的地方请各位大虾斧正。
作者: 爱飞    时间: 2015-3-19 07:43
兴趣是最好的老师,百度是最好的词典。
作者: 小妖女    时间: 2015-3-20 20:44
在我安装pear包的时候老是提示,缺少某某文件,才发现 那群extension 的排列是应该有一点的顺序,而我安装的版本的排序不是正常的排序。没办法我只好把那群冒号加了上去,只留下我需要使用的扩展。
作者: 小女巫    时间: 2015-4-1 15:09
当留言板完成的时候,下步可以把做1个单人的blog程序,做为目标,
作者: 飘灵儿    时间: 2015-4-10 05:15
环境搭建好,当你看见你的浏览器输出“it works\\\\\\\"时你一定是喜悦的。在你解决问题的时候,我强烈建议多读php手册。
作者: 灵魂腐蚀    时间: 2015-4-10 09:20
写的比较杂,因为我也是个新手,不当至于大家多多指正。
作者: 分手快乐    时间: 2015-4-23 01:54
微软最近出的新字体“微软雅黑”,虽然是挺漂亮的,不过firefox  支持的不是很好,所以能少用还是少用的好。
作者: 深爱那片海    时间: 2015-4-26 07:19
做为1门年轻的语言,php一直很努力。
作者: 若相依    时间: 2015-4-26 11:07
遇到出错的时候,我经常把错误信息直接复制到 google的搜索栏,一般情况都是能搜到结果的,不过有时候会搜出来一大片英文的出来,这时候就得过滤一下,吧中文的弄出来,挨着式方法。
作者: admin    时间: 2015-5-1 12:11
至于模板嘛,各位高人一直以来就是争论不休,我一只小菜鸟就不加入战团啦,咱们新手还是多学点东西的好。
作者: 兰色精灵    时间: 2015-5-3 16:43
如果你可以写完像留言板这样的程序,那么你可以去一些别人的代码了,
作者: 莫相离    时间: 2015-5-7 06:57
我要在声明一下:我是个菜鸟!!我对php这门优秀的语言也是知之甚少。但是我要在这里说一下php在网站开发中最常用的几个功能:
作者: 海妖    时间: 2015-6-17 23:01
说点我烦的低级错误吧,曾经有次插入mysql的时间 弄了300年结果老报错,其实mysql的时间是有限制的,大概是到203X年  具体的记不清啦,囧。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2