PHP编程教程_缓存技术的解决办法

    作者:在线学习更新于: 2015-06-09 11:19:51

    大神带你学编程,欢迎选课

    首先第一是PHP语言的编程教程-缓存问题:例如,一些信息往往是相同的,但仍然能够改变的信息在高速缓存来加速显示,这是非常有价值的,所谓的高速缓存中,流行的理解的是,一些的共享信息存储在服务器端。它是在服务器与生死,我们可以指定保存缓存时的时间的下一个更新的判断,例如,要更新一次,就可以记录最后更新的时间和在五分钟内比较当前时间,如果超过五分钟,读取数据库,更新替换,或者直接读取的高速缓存数据,当然,要求客户端高速缓存用户仅激活一次。

     

    PHP编程教程

    ob_start()函数:打开输出缓冲区.

    函数格式 void ob_start(void)

    说明:当缓冲区激活时,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区。为了输出缓冲区的内容,可以使用ob_end_flush()或flush()输出缓冲区的内容。

    Flush:刷新缓冲区的内容,输出。

    函数格式:flush()

    说明:这个函数经常使用,效率很高。

    ob_get_contents :返回内部缓冲区的内容。

    函数格式:string ob_get_contents(void)

    说明:这个函数会返回当前缓冲区中的内容,如果输出缓冲区没有激活,则返回 FALSE.

    ob_get_length:返回内部缓冲区的长度。

    函数格式:int ob_get_length(void)

    说明:这个函数会返回当前缓冲区中的长度;和ob_get_contents一样,如果输出缓冲区没有激活,则返回 FALSE.

    ob_end_clean:删除内部缓冲区的内容,并且关闭内部缓冲区

    函数格式:void ob_end_clean(void)

    说明:这个函数不会输出内部缓冲区的内容而是把它删除

    ob_end_flush:发送内部缓冲区的内容到浏览器,并且关闭输出缓冲区

    函数格式:void ob_end_flush(void)

    说明:这个函数发送输出缓冲区的内容(如果有的话)

    ob_implicit_flush:打开或关闭绝对刷新

    函数格式:void ob_implicit_flush ([int flag])

    说明:默认为关闭缓冲区,打开绝对输出后,每个脚本输出都直接发送到浏览器,不再需要调用 flush()

    二、编程教程文件写入

    int fwrite ( resource handle, string string [, int length] )

    fwrite() 把 string 的内容写入 文件指针 handle 处。 如果指定了 length,当写入了 length 个字节或者写完了 string 以后,写入就会停止,视乎先碰到哪种情况。

    fwrite() 返回写入的字符数,出现错误时则返回 FALSE 。

    相关参考官方网站: 文件参考

    三、编程教程解决方案

    思路:开启 ob_start缓冲,当已经调出数据的时候获取 ob_get_contents,然后生成静态页,ob_end_clean清除缓冲.ok,就这么来,来看一个例子(php+mysql的结合):

    创建数据库:

    view source


    print? 
    1

    CREATE TABLE `bihtml` ( `id` int(11) NOT NULL auto_increment, `szdtitle` varchar(16) NOT NULL, `szdcontent` text NOT NULL, PRIMARY KEY (`id`) ) TYPE=MyISAM;


    获取当前的ID,并导入模板:说明问题1:一般建议管理员及时补充数据生成静态页面,可以考虑排名和文件路径的记录产生2 :. PHP的主要ob_starts()和ob_get_contents,当产生有用的静态页面,当然,打开数据库可以考虑直接更换模板变量是可能的内部3:主要模板使用Smarty的,PHPLIB是可能的,Smarty的使用相对简单介绍PHP,一个。 Web脚本语言设计的门近几年的兴起,由于其强大和可扩展性,在最近几年取得了很大的进步,PHP ASP相比于传统的网站,速度有绝对的优势,像MSSQL转60000。如果你需要数据的40秒PHP,ASP不到两分钟。但是,由于网站的数据越来越多,我们都渴望更快的数据呼叫,不需要从数据库每次出去,我们可以从其他地方,如文件,或一个内存地址,它是PHP缓存技术,这是Cache技术。

    其次,深入分析在一般情况下,目的是缓存数据在一个地方可以更快的访问速度,毫无疑问,它的内存是最快的,但几百M数据可以把它的内存?这是不现实的,当然有时候临时自动释放作为服务器缓存,比如ob_start()函数,然后再发送文件头被缓存在内存中前打开网页的缓存页面的内容,你知道,等页面输出清晰或等待ob_get_contents回报,或者被清除ob_end_clean显示,它可以很好地利用生成静态页面,模板可以得到很好的体现,我的这篇编程语言文章深入讨论:在PHP生成静态页面,这是一种方式,但是这是一个好办法,除了临时的,不是解决我们的问题,存在ASP的目标应用程序,你可以保存常用参数。这也一点缓冲,但在PHP中,我还没有看到开发商输出这样的对象,确实没有必要.asp.net页面缓存使用的视图状态,并且相关的缓存文件(不一定准确),该文件是修改缓存更新,文件没有被修改,而不是出(注1),读取缓存,返回的结果是,这个想法,看看源代码:现在,我打破这个代码是三个渐进的解释该方案透析这个缓存类(类有恃无恐继续看到)的高速缓存的名称,有两个属性:私人$ cache_dir的;私人$ expireTime = 180; $ cache_dir的是父目录缓存文件被放置相对于站点的目录,$ expireTime(注1)。他是我们的缓存数据过期时间,主要的思路是这样的:当数据或文件被加载,首先确定缓存,该文件的最后修改时间和时间与缓存的当前时间在相当大的,如果没有过期缓存指令的比率,然后返回到小假文件不存在,则返回假,读取被写入到高速缓存中的原始数据时返回false文件,然后将数据返回查看程序:

    view source


    print? 
    01

    function __construct($cache_dirname){ 

    02

    if(!@is_dir($cache_dirname)){ 



    03


    04

    if(!@mkdir($cache_dirname,0777)){ 



    05


    06

    $this->warn('缓存文件不存在而且不能创建,需要手动创建.'); 



    07


    08

    return false; 



    09

    10



    11

    $this->cache_dir = $cache_dirname; 

    12

    }


    当类第一次被实例的时候构造默认函数带参数缓存文件名称,如文件不存在,创建一个有编辑权限的文件夹,创建失败的时候抛出异常.然后把cache类的 $cache_dir属性设置为这个文件夹名称,我们的所有缓存文件都是在这个文件夹下面的.

    view source


    print? 
    1

    function __destruct() 

    2



    3

    echo

    4

    'Cache class bye.'; 



    5

    }


    这是class类的析构函数,为了演示,我们输出一个字符串表示我们释放cache类资源成功.

     




     


    1

    function warn($errorstring) 

    2



    3

    echo "发生错误:

    ".$errorstring."
    "; 

    4

    }

     

     


    这个方法输出错误信息. 这个方法返回当前url的信息,这是我看国外很多人的cms系统这样做,主要是缓存x.php?page=1,x.php?page=2,等这种文件的,这里列出是为了扩展的这个cache类功能的.

    view source


    print? 


    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读取到原来的类型.

    view source


    print? 


    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 ".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;

    }

    这个函数是我们调用的方法,可以写成接口的方法,由传入参数判断文件存在不,文件最后修改时间+expireTime的时间是不是过了当前时间(大于的话说明没有过期),如果文件不存在或者已经过期,重新加载原始数据,这里,为了简单期间,我们是直接源是字符串,您可以把cache类继承某类,取到数据库的数据.(注释2)

    四、编程教程补充说明,结语

    注释一:这个缓存的时间您可以自己调,可以根据时间情况读取数组,xml,缓存等,请按照您的方便,值得一提的是缓存的时间(也就是缓存的key)也用缓存控制,.这在cms系统中被广泛使用,他们把要更新的key放在缓存中,非常容易控制全战.

    注释二:php5开始支持类继承,这是让人兴奋的,把网站全局休息写在一个配置的类里面,再写与数据层交互的类(如与MySQL交互的类),我们的这个cache类继承数据交互的类,可以非常容易的读取数据库,这是外话,此处不再展开,有时间和大家详谈.

    特别说明,这个类文件针对的php5以上版本,其他版本的请不要使用类.

    function get_url()

    {

    if (!isset($_SERVER['REQUEST_URI']))

    {

    $url = $_SERVER['REQUEST_URI'];

    }else{

    $url = $_SERVER['SCRIPT_NAME'];

    $url .= (!emptyempty($_SERVER['QUERY_STRING'])) ? '?' . $_SERVER['QUERY_STRING'] : '';

    }

    return $url;

    }

    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 .= (!emptyempty($_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; }

     

    }

    ?>

     

    ob_start();

    $id=_POST['id'] if(!isset($id)&&is_integer($id))

    { @$db=new mysqli('localhost','root','admin','bihtml');

    $result=$db->fetch_one_array("select * from szd_bi where id='$id'");

    if(!emptyempty($result))

    {

    $tmp->assign(array(

     

    "Szdtitle",htmlspecialchars($result['titles']),

    "Szdcontent",$result['titles']));

    } $tpl->display('default_1.tpl');

    $this_my_f= ob_get_contents(); //此处关键

    ob_end_clean();

    $filename = "$id.html"; if(tohtmlfile_cjjer($filename,$this_my_f))

    echo

    "生成成功 $filename"; else

    echo

    "生成识别"; }

    }

    //把生成文件的过程写出函数

    function tohtmlfile_cjjer($file_cjjer_name,$file_cjjer_content)

    { if (is_file ($file_cjjer_name)){

    @unlink ($file_cjjer_name); }

    $cjjer_handle = fopen ($file_cjjer_name,"w"); if (!is_writable ($file_cjjer_name)){

     

    return false; }

    if (!fwrite ($cjjer_handle,$file_cjjer_content)){

    return false;

    } fclose ($cjjer_handle); //关闭指针

    return

    $file_cjjer_name;

    }

    以上PHP语言的编程教程的缓存问题,正在学习的您掌握了么?课课家推荐编程的网络课程教学视频:【PHP与MVC的那些事儿

php 更多推荐

课课家教育

未登录