fcicq
新手上路

初级会员
UID 24467
精华
0
积分 21
帖子 587
金钱 20 喜悦币
威望 0
人脉 1
阅读权限 10
注册 2003-11-8 来自 fcicq.net
状态 离线
|
[广告]: Enom域名自助付费 自助注册 自助PUSH 主流域名COM等一律57.99元年
喜悦原创首发 - 小论各种缓存手段
缓存能够加速程序的运行及显示.
但这里讨论的缓存指的不是php的预编译代码.所以zo,eacc,apc等不在讨论之列.
首先讨论程序手段
1 asp:
可使用application进行缓存.比较典型的例子就是动网所使用的缓存类.
由于asp提供的方便,所以感觉asp方面的缓存没什么特别大的进步.
2 php:
由于php没有类似application这样的全局变量.
所以许多人独辟蹊径找到了自己的方法,以下列举几种.
2.1 文件缓存(php代码)
常见例子:discuz,phpwind
dz将缓存转换成对应的php代码,然后保存起来,pw也是如此
重新include后便得到对应的变量值.
pw参见:admin/cache.php,require/pw_func.php
pw代码举例:
$forum_cache.="'$sub2[fid]' => Array(\n\t\t'fid' => '$sub2[fid]',\n\t\t'fup'=>'$sub2[fup]',\n\t\t'type' => '$sub2[type]',\n\t\t'name' => '$sub2[name]',\n\t\t'f_type' => '$sub2[f_type]',\n\t\t'cms' => '$sub2[cms]',\n\t\t'ifhide' => '$sub2[ifhide]',\n\t\t),\n";
$forumcache = "\$forumcache='\n$forumcache';\n\$cmscache='\n$cmscache';";
writeover(D_P."data/bbscache/forumcache.php","<?php\n".$forumcache."\n?>");
writeover(D_P.'data/bbscache/forum_cache.php',"<?php\n".$forum_cache."\n?>");
这就是个变相的serialize.
dz参见:include/cache.func.php
function writetocache($script, $cachenames, $cachedata = '', $prefix = 'cache_') {
if(is_array($cachenames) && !$cachedata) {
foreach($cachenames as $name) {
$cachedata .= getcachearray($name);
}
}
if(@$fp = fopen("$dir$prefix$script.php", 'w')) {
fwrite($fp, "<?php\n//Discuz! cache file, DO NOT modify me!\n".
"//Created on ".date("M j, Y, G:i")."\n\n$cachedata?>");
(无关代码已去掉)
2.2 单纯的文件缓存:
将所存变量序列化后得到缓存文本.
(当然,如果你知道a是字符串/数字的话你就不用序列化了)
简单例子:
写入:file_put_content('a',serialize($a));
读取:$a=unserialize(file_get_content('a'));
2.2.1 /dev/shm
基于内存(shmod)的文件缓存,效率能高不少.方法实际上一样.
只不过修改了保存的位置.
小提示:你可以把/dev/shm符号链接到你的缓存目录.
2.2.2 nfs
可以做为分布式缓存的一个基础.但是相对来说就要耗网络资源了.
2.2.3 memcache
同样是分布式,它就好的多了.
由于使用者不太多这里不多讨论.
2.2.4 数据库:
数据库实际也可以做为缓存的一种方式,但是数量较大时工作的就不太好了.
2.3 Session
有了缓存手段,自然可以存不少东西.
就比如:session
使用数据库来保存session,奶瓶已经在另一篇文章中讨论过:(http://www.phpx.com/happy/thread-121049-1-1.html)
另外可以使用现成的session_handler代码.这都是可以找到的.
这里推荐使用mysql(innodb)或sqlite.
nfs保存session有很大的网络访问的开销.这一点相当的不好.
memcache虽然解决了这个问题,但是清理更复杂.
所以保存session不推荐他们.
讨论完程序手段,下面就轮到服务器软件中的缓存
3 服务器手段:
这里只举一例:
apache,mod_gzip
mod_deflate是在内存中进行的缓存,与mod_gzip类似,这里不做过多讨论.
mod_gzip有预压缩机制(可选).但是部分浏览器(nc4,ie5等)不能正确的处理压缩的内容.
(参见:http://support.microsoft.com/default.aspx?scid=kb;en-us;823386&Product=ie600)
虽然使用这部分浏览器的人不太多,但是如果为了安全起见,最好还是做好这方面的工作.
联系作者fcicq: fcicqbbs at gmail dot com.
如果有问题,或者错误,均可联系。
版权声明:原创
最后一句:喜悦首发,严禁转帖
小广告:欢迎访问偶的blog,征集友情链接中...可邮件联系.
fcicq 2006.8.6
|  学科
|
|