使用缓存的场景大概是符合这一点:数据改变的频率不快.也就是说:一个数据,如果好几个小时,甚至好几天都不发生改变,那么就可以使用缓存. 使用缓存的模式是这样: if(缓存不存在) { 从数据库中取出数据,存入缓存,然后给缓存设置一个时间 } else { 取出缓存中的数据 } 如果是数据基本上永远都不变的话,那么可以使用"页面静态化"的技术,"页面静态化"比"缓存"更加提高网站访问的性能.
ThinkPHP在数据缓存方面包括文件方式、共享内存方式和数据库方式在内的多种方式进行缓存,通过插件方式还可以增加以后需要的缓存类,让应用开发可
以选择更加适合自己的缓存方式,从而有效地提高应用执行效率.目前已经支持的缓存方式包括:File、Apachenote、Apc、
Eaccelerator、Memcache、Shmop、Sqlite、Db、Redis和Xcache.
为了开发的方便,可以把缓存给去除.
①找到ThinkPHPCommonconvention.php和ThinkPHPCommondebug.php
debug.php中
'TMPL_CACHE_ON'=false, // 默认开启模板缓存
复制代码
convention.php中'
TMPL_CACHE_ON' = false, // 默认开启模板编译缓存 false 的话每次都重新编译模板
'ACTION_CACHE_ON' = false, // 默认关闭Action 缓存
'HTML_CACHE_ON' = false, // 默认关闭静态缓存
thinkphp 怎么关闭全部缓存?(
APP_DEBUG=true
DB_FIELD_CACHE=false
HTML_CACHE_ON=false
关闭ThinkPHP模板缓存
最后自己找见了,在config.php里面加上一句
'TMPL_CACHE_ON' = false,
这样每次运行都重新生成缓存
第一段:全页面静态化缓存
也就是将页面全部生成html静态页面,用户访问时直接访问的静态页面,而不会去走php服务器解析的流程.此种方式,在CMS系统中比较常见,比如dedecms;
一种比较常用的实现方式是用输出缓存:
Ob_start()******要运行的代码*******$content=Ob_get_contents();****将缓存内容写入html文件*****Ob_end_clean();
第二段:数据缓存
顾名思义,就是缓存数据的一种方式;比如,商城中的某个商品信息,当用商品id去请求时,就会得出包括店铺信息、商品信息等数据,此时就可以将这些数据缓存到一个php文件中,文件名包含商品id来建一个唯一标示;下一次有人想查看这个商品时,首先就直接调这个文件里面的信息,而不用再去数据库查询;其实缓存文件中缓存的就是一个php数组之类;
Ecmall商城系统里面就用了这种方式;
第三段:查询缓存
其实这跟数据缓存是一个思路,就是根据查询语句来缓存;将查询得到的数据缓存在一个文件中,下次遇到相同的查询时,就直接先从这个文件里面调数据,不会再去查数据库;但此处的缓存文件名可能就需要以查询语句为基点来建立唯一标示;
按时间变更进行缓存
第四段:页面部分缓存
该种方式,是将一个页面中不经常变的部分进行静态缓存,而经常变化的块不缓存,最后组装在一起显示;可以使用类似于ob_get_contents的方式实现,也可以利用类似ESI之类的页面片段缓存策略,使其用来做动态页面中相对静态的片段部分的缓存.
该种方式可以用于如商城中的商品页;
第五段:Opcode缓存
首先php代码被解析为Tokens,然后再编译为Opcode码,最后执行Opcode码,返回结果;所以,对于相同的php文件,第一次运行时可以缓存其Opcode码,下次再执行这个页面时,直接会去找到缓存下的opcode码,直接执行最后一步,而不再需要中间的步骤了.
比较知名的是XCache、TurckMMCache、PHPAccelerator等.
第六段:按内容变更进行缓存
这个也并非独立的缓存技术,需结合着用;就是当数据库内容被修改时,即刻更新缓存文件;
比如,一个人流量很大的商城,商品很多,商品表必然比较大,这表的压力也比较重;我们就可以对商品显示页进行页面缓存;
试想,如果对商品页不缓存,那么每次访问一个商品就要去数据库查一次,如果有10万人在线浏览商品,那服务器压力就大了;
第七段:内存式缓存
提到这个,可能大家想到的首先就是Memcached;memcached是高性能的分布式内存缓存服务器.一般的使用目的是,通过缓存数据库查询结果,减少数据库访问次数,以提高动态Web应用的速度、提高可扩展性.
它就是将需要缓存的信息,缓存到系统内存中,需要获取信息时,直接到内存中取;比较常用的方式就是key_value方式;
connect($memcachehost,$memcacheport)ordie("Couldnotconnect");$memcache-set('key','缓存的内容');$get=$memcache-get($key);//获取信息?
第八段:apache缓存模块
apache安装完以后,是不允许被cache的.大理IT培训认为如果外接了cache或squid服务器要求进行web加速的话,就需要在htttpd.conf里进行设置,当然前提是在安装apache的时候要激活mod_cache的模块.
PHP 输出缓存详解
Output Control
函数可以让你自由控制脚本中数据的输出.它非常地有用,特别是对于:当你想在数据已经输出后,再输出文件头的情况.
输出控制函数不对使用 header() 或 setcookie(),
发送的文件头信息产生影响,只对那些类似于 echo() 和 PHP 代码的数据块有作用.
我们先举一个简单的例子,让大家对Output
Control有一个大致的印象:
Example 1.
代码如下:
php
ob_start(); //打开缓冲区
echo
\"Hellon\"; //输出
header("location:index.php"); //把浏览器重定向到index.php
ob_end_flush();//输出全部内容到浏览器
所有对header()函数有了解的人都知道,这个函数会发送一段文件头给浏览器,但是如果在使用这个函数之前已经有了任何输出(包括空输出,比如空格,回车和换行)就会提示出错.如果我们去掉第一行的ob_start(),再执行此程序,我们会发现得到了一条错误提示:"Header
had all ready send
by"!但是加上ob_start,就不会提示出错,原因是当打开了缓冲区,echo后面的字符不会输出到浏览器,而是保留在服务器,直到你使用
flush或者ob_end_flush才会输出,所以并不会有任何文件头输出的错误!
第一段: 相关函数简介:
①.、Flush:刷新缓冲区的内容,输出.
函数格式:flush()
说明:这个函数经常使用,效率很高.
函数格式:void ob_start(void)
说明:当缓冲区激活时,所有来自PHP程序的非文件头信息均不会发送,而是保存在内部缓冲区.为了输出缓冲区的内容,可以使用ob_end_flush()或flush()输出缓冲区的内容.
使用方法:string
ob_get_contents(void)
说明:这个函数会返回当前缓冲区中的内容,如果输出缓冲区没有激活,则返回 FALSE .
使用方法:int
ob_get_length(void)
说明:这个函数会返回当前缓冲区中的长度;和ob_get_contents一样,如果输出缓冲区没有激活.则返回
FALSE.
使用方法:void ob_end_flush(void)
说明:这个函数发送输出缓冲区的内容(如果有的话).
使用方法:void
ob_end_clean(void)
说明:这个函数不会输出内部缓冲区的内容而是把它删除!
ob_implicit_flush ([int flag])
说明:使用过Perl的人都知道$|=x的意义,这个字符串可以打开/关闭缓冲区,而ob_implicit_flush函数也和那个一样,默认为关闭缓冲区,打开绝对输出后,每个脚本输出都直接发送到浏览器,不再需要调用
flush()
第二段:深入了解:
① 关于Flush函数:
) print(" ");
// 这一句话非常关键,cache的结构使得它的内容只有达到一定的大小才能从浏览器里输出
//
换言之,如果cache的内容不达到一定的大小,它是不会在程序执行完毕前输出的.经
// 源源不断的被发送出去.
For($j = 1; $j
echo $j."
";
flush();
//这一部会使cache新增的内容被挤出去,显示到浏览器上
sleep(1); //让程序"睡"一秒钟,会让你把效果看得更清楚
}
具体效果你可以到这里看看
注:如果在程序的首部加入ob_implicit_flush()打开绝对刷新,就可以在程序中不再使用flush(),这样做的好处是:提高效率!
我想先引用我的好朋友y10k的一个例子:
phpinfo(); //使用phpinfo函数
$info=ob_get_contents(); //得到缓冲区的内容并且赋值给$info
$file=fopen(\'info.txt\',\'w\'); //打开文件info.txt
fwrite($file,$info);
//写入信息到info.txt
fclose($file); //关闭文件info.txt
用以上的方法,就可以把不同用户的phpinfo信息保存下来,这在以前恐怕没有办法办到!其实上面就是将一些"过程"转化为"函数"的方法!
或许有人会问:"难道就这个样子吗?还有没有其他用途?"当然有了,比如笔者论坛的PHP
语法加亮显示就和这个有关(PHP默认的语法加亮显示函数会直接输出,不能保存结果,如果在每次调用都显示恐怕会很浪费CPU,笔者的论坛就把语法加亮函数显示的结果用控制缓冲区的方法保留了),大家如果感兴趣的话可以来看看!
可能现在大家对ob_start()的功能有了一定的了解,上面的一个例子看似简单,但实际上已经掌握了使用ob_start()的要点.
①使用ob_start打开browser的cache,这样可以保证cache的内容在你调用flush(),ob_end_flush()(或程序执行完毕)之前不会被输出.
ob_start一个很大的特点;也可以使用ob_start的参数,在cache被写入后,然后自动运行命令,比如
ob_start(\"ob_gzhandler\");而我们最常用的做法是用ob_get_contents()得到cache中的内容,然后再进行处理......
来,让我们看看能用ob系列函数做些什么......
第一段: 静态模版技术
我所知道的实现静态输出的有两种办法:
①通过y10k修改的phplib的一个叫template.inc.php类实现.
对于第一种方法,因为不是这篇文章所要研究的问题,所以不再赘述.
我们现在来看一看第二种方法的具体实现:
ob_start();//打开缓冲区
php页面的全部输出
$content =
ob_get_contents();//取得php页面输出的全部内容
$fp = fopen("output00001.html", "w");
//创建一个文件,并打开,准备写入
fwrite($fp, $content);
//把php页面的内容全部写入output00001.html,然后......
fclose($fp);
这样,所谓的静态模版就很容易的被实现了......
第二段: 捕捉输出
以上的Example
你可以设法捕捉一些关键字,然后去对它进行再处理,比如Example
Function run_code($code) {
If($code) {
ob_start();
eval($code);
$contents = ob_get_contents();
ob_end_clean();
}else {
echo "错误!没有输出";
exit();
return $contents;
以上这个例子的用途不是很大,不过很典型$code的本身就是一个含有变量的输出页面,而这个例子用eval把$code中的变量替换,然后对输出结果再进行输出捕捉,再一次的进行处理......
/*
Compression Speeds up the Web
** Author........:
** Filename......: gzdoc.php
** Last
** PHP was
configured with --with-zlib[=DIR]
** Notes.........: Dynamic Content
Acceleration compresses
** the data transmission data on the fly
** code
** Most newer browsers since
** been equipped to support the HTTP 1.1
** standard
known as \"content-encoding.\"
** Essentially the browser indicates to the
** server that it can accept \"content encoding\"
** and if the server
is capable it will then
** compress the data and transmit it. The
**
browser decompresses it and then renders
** the page.
** Modified
** based on ideas by Sandy McArthur, Jr
** Usage........:
** No space before the beginning of the first
\'?\' tag.
** ------------Start of file----------
** |?
** |
include(\'gzdoc.php\');
** |HTML
** |... the page
...
** |/HTML
** | gzdocout();
** -------------End of file-----------
*/
ob_implicit_flush(0);
function CheckCanGzip(){
global
$HTTP_ACCEPT_ENCODING;
if (headers_sent() || connection_timeout() ||
connection_aborted()){
return 0;
if (strpos($HTTP_ACCEPT_ENCODING,
\'x-gzip\') !== false) return \"x-gzip\";
if
(strpos($HTTP_ACCEPT_ENCODING,\'gzip\') !== false) return \"gzip\";
return
0;
function
GzDocOut($level=1,$debug=0){
$ENCODING = CheckCanGzip();
if ($ENCODING){
print \"n!-- Use compress $ENCODING --n\";
$Contents =
ob_get_contents();
if ($debug){
$s = \"pNot
compress length: \".strlen($Contents);
$s .= \"
Compressed length:
\".strlen(gzcompress($Contents,$level));
$Contents .= $s;
header(\"Content-Encoding: $ENCODING\");
$Size = strlen($Contents);
$Crc =
$Contents = gzcompress($Contents,$level);
print $Contents;
pack(\'V\',$Crc);
print pack(\'V\',$Size);
exit;
}else{
ob_end_flush();
这是catoc的一段很早以前的代码,是在weblogs.com看到的,他利用了zlib的函数,对传输的内容进行了压缩,测试表明,对于10k以上的页面,会产生效果,而且页面越大,效果越明显......