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([email protected]_dir($cache_dirname)){
03
04
if([email protected]($cache_dirname,0777)){
05
06
$this->warn(‘缓存文件不存在而且不能创建,需要手动创建.’);
07
08
return false;
09
}
10
}
11
$this->cache_dir = $cache_dirname;
12
}
#p#分页标题#e#
当类第一次被实例的时候构造默认函数带参数缓存文件名称,如文件不存在,创建一个有编辑权限的文件夹,创建失败的时候抛出异常.然后把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;
}
#p#分页标题#e#
这个函数是我们调用的方法,可以写成接口的方法,由传入参数判断文件存在不,文件最后修改时间+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([email protected]_dir($cache_dirname))
{
if([email protected]($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的那些事儿】