下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

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

作者:在线学习     来源: 课课家教育点击数:624发布时间: 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的那些事儿

赞(14)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程