首页 »PHP教程 » php入门:PHP大型Web应用入门( 7) »正文
php入门:PHP大型Web应用入门( 7)
来源: 发布时间:星期一, 2009年1月12日 浏览:11次 评论:0
下面举 ![](/icons/28255yi.gif) 个例子 ![](/icons/28255dou.gif) 来介绍说明tmpfs和shm是如何被系统用到并做缓存Cache来用 ![](/icons/28255de.gif) ![](/icons/28255dou2.gif) 这里是cache.inc.php中 ![](/icons/28255de.gif) obtain_cache ![](/icons/28255hanshu.gif) : functionobtain_config![](/icons/28255kh.gif) { global$db,$global_db_prefix; $config_cache_file='../../data/cache/config.cache';
( d('SHM_SUPPORT')){ global$shm; @$CONF=$shm->get_var(SHM_VAR_PARA_CACHE);
($CONF['cfg_end']! 0){ $sql="SELECT*FROM{$global_db_prefix}config"; $res=$db->sql_query($sql); $CONF= .gif' /> ; while($r=$db->sql_fetchrow($res)){ $CONF[$r['config_varname']]=$r['config_value']; } $CONF['cfg_end']=0; $shm->put_var(SHM_VAR_PARA_CACHE,$CONF); } }
{
(!@file_exists($config_cache_file)){ $str="<?phprn//ConfigCacheFile...DONOTMODIFYTHISFILEPLEASE!!!rn (! d('IN_BSG')){rntexit;rn}rn".'$CONF= .gif' />('."rn"; $sql="SELECT*FROM{$global_db_prefix}config"; $query=$db->sql_query($sql); while($r=$db->sql_fetchrow($query)){ $value="'".addslashes($r['config_value'])."'"; $str.="t'".$r['config_varname']."'ttt".'=>'.$value.",rn"; } $str.="t'cfg_end'ttt=>0rn"; $str.=");rn?>";
(!@$fp=fopen($config_cache_file,'w'))
false; fwrite($fp,$str); fclose($fp); }
($config_cache_file); }
$CONF; }
这个 ![](/icons/28255hanshu.gif) 分为两个部分 ![](/icons/28255dou.gif) 分别对应于shm和文件 ![](/icons/28255dou2.gif) 首先它会检查系统是否支持共享内存(这个常量是在common.inc.php中已经设置过 ![](/icons/28255de.gif) ) ![](/icons/28255dou.gif) 如果支持 ![](/icons/28255dou.gif) ![](/icons/28255hanshu.gif) 会在config表中(具体应用中我也不知道你会把它放在哪里)读取所有 ![](/icons/28255de.gif) 变量 ![](/icons/28255dou.gif) 并把它们放到 ![](/icons/28255yi.gif) 个 ![](/icons/28255shuzu.gif) 中直接保存到shm里(当然实际操作不是这样简单 ![](/icons/28255de.gif) ) ![](/icons/28255dou.gif) 如果系统不支持shm ![](/icons/28255dou.gif) ![](/icons/28255hanshu.gif) 会试图生成 ![](/icons/28255yi.gif) 个php文件 ![](/icons/28255dou2.gif) 当再次 ![](/icons/28255diaoyong.gif) 这个 ![](/icons/28255hanshu.gif) 时 ![](/icons/28255dou.gif) 如果shm里已经有了这个 ![](/icons/28255shuzu.gif) 存在 ![](/icons/28255dou.gif) 或者已经有了这个文件存在 ![](/icons/28255de.gif) 话(前面已经规定这个文件会被保存在tmpfs上) ![](/icons/28255dou.gif) ![](/icons/28255hanshu.gif) 会直接返回它们 ![](/icons/28255de.gif) 内容 ![](/icons/28255dou.gif) 不必再去读取数据库 ![](/icons/28255dou2.gif) 这就是 ![](/icons/28255yi.gif) 个简单 ![](/icons/28255de.gif) cache概念 ![](/icons/28255dou2.gif) 究竟什么样 ![](/icons/28255de.gif) 数据可以并且适合被cache?这和cache ![](/icons/28255de.gif) 更新方式有关 ![](/icons/28255dou2.gif) cache有定时间隔更新 ![](/icons/28255de.gif) ![](/icons/28255dou.gif) 有不定时更新 ![](/icons/28255de.gif) ![](/icons/28255dou2.gif) 定时更新 ![](/icons/28255de.gif) 指cache存在若干时间后再次重新生成cache ![](/icons/28255dou.gif) 通常用于统计数据 ![](/icons/28255dou.gif) 比如在线人数等 ![](/icons/28255dou2.gif) 不定时更新 ![](/icons/28255de.gif) 是指生成后就 ![](/icons/28255yi.gif) 直保持不变 ![](/icons/28255dou.gif) 直到再次检测到不存在或已过期、已损坏等情况出现 ![](/icons/28255dou.gif) 通常见于参数 ![](/icons/28255diaoyong.gif) 、模板编译结果等 ![](/icons/28255dou2.gif) 这些数据 ![](/icons/28255de.gif) 特点是它们都是临时 ![](/icons/28255de.gif) ![](/icons/28255dou.gif) 可以被丢弃 ![](/icons/28255de.gif) ![](/icons/28255dou.gif) 比如没人会在乎 ![](/icons/28255yi.gif) 个模板是否被重新编译过 ![](/icons/28255dou.gif) 除了在编译 ![](/icons/28255de.gif) 那次执行中多占用 ![](/icons/28255yi.gif) 点时间 ![](/icons/28255dou2.gif) 这批可丢弃 ![](/icons/28255de.gif) 数据就可以被放心地保存在内存或者tmpfs中 ![](/icons/28255dou.gif) ![](/icons/28255yinwei.gif) 它们不怕丢失 ![](/icons/28255dou.gif) 并且随时可以被重建 ![](/icons/28255dou2.gif) 早期版本 ![](/icons/28255de.gif) PHPWIND论坛 ![](/icons/28255de.gif) cache机制是很差 ![](/icons/28255de.gif) ![](/icons/28255dou.gif) 虽然它很快 ![](/icons/28255dou.gif) 但是很脆弱 ![](/icons/28255dou.gif) ![](/icons/28255yi.gif) 旦cache文件损坏或丢失 ![](/icons/28255dou.gif) 它不会自己去创建它 ![](/icons/28255dou.gif) 而是直接导致 ![](/icons/28255chengxu.gif) 无法运行 ![](/icons/28255dou.gif) 这种只能叫做临时文件 ![](/icons/28255dou.gif) 而不能叫cache ![](/icons/28255dou2.gif) 我不知道现在 ![](/icons/28255de.gif) PHPWIND什么样 ![](/icons/28255dou.gif) ![](/icons/28255yinwei.gif) 我 ![](/icons/28255yi.gif) 直没兴趣去看它…… 下面是shm.inc.php ![](/icons/28255de.gif) 源码 ![](/icons/28255dou.gif) 我不想对它加太多 ![](/icons/28255de.gif) 注释 ![](/icons/28255dou.gif) ![](/icons/28255yinwei.gif) 它很机械 ![](/icons/28255dou.gif) 没什么好注释 ![](/icons/28255de.gif) ![](/icons/28255dou2.gif) 唯 ![](/icons/28255yi.gif) 需要注意 ![](/icons/28255de.gif) 是php ![](/icons/28255de.gif) 两种支持shm ![](/icons/28255de.gif) 方式 ![](/icons/28255dou2.gif) ![](/icons/28255yi.gif) 种是shmop ![](/icons/28255dou.gif) ![](/icons/28255yi.gif) 种是sysv ![](/icons/28255de.gif) shm ![](/icons/28255dou.gif) 区别 ![](/icons/28255de.gif) 是sysv只在UNIX/LINUX系统中存在 ![](/icons/28255dou.gif) shmop更底层 ![](/icons/28255dou.gif) 只接受 ![](/icons/28255zifu.gif) 串数据
<?php
BsmShm { var$shm_id; var$shm_mod; functionBsmShm![](/icons/28255kh.gif) { //InitSharedMemorySupport... //BothSysVShmandShmoparesupportunder*NIXOperating![](/icons/28255System.gif) //ButOnlyShmopcanbeusedinWindows.
(get_sys![](/icons/28255kh.gif) SYSTEM_WIN){
(function_exists('shmop_open')){ $this->shm_mod='shmop'; }
{ $this->shm_mod='none'; $this->shm_id=false; } }
{
(function_exists('shm_attach')){ $this->shm_mod='sysv'; }
![](/icons/28255else.gif) (function_exists('shmop_open')){ $this->shm_mod='shmop'; }
{ //NoModule ed $this->shm_mod='none'; $this->shm_id=false; } }
($this->shm_mod 'sysv'){ $this->shm_id=shm_attach(ftok(__FILE__,'g'),SHM_SIZE,0600); }
![](/icons/28255else.gif) ($this->shm_mod 'shmod'){ // no"sysv"module ed,function"ftok )"isunavailiable. $this->shm_id=shmop_open(SHM_KEY,'n',0600,SHM_SIZE); }
; } functionput_var($varkey,$varval) { //Writeavalue oshm
($this->shm_mod 'sysv')
shm_put_var($this->shm_id,$varkey,$varval);
![](/icons/28255else.gif) ($this->shm_mod 'shmod'){ //shmopismuchmorelow-levelthansysv,youneedtooperateevery yourself! $curr=shmop_read($this->shm_id,0,shmop_size($this->shm_id)); $curr=base64_decode($curr); $curr=substr($curr,0,strpos($curr," 这个 ![](/icons/28255class.gif) 同时支持sysv和shmop ![](/icons/28255dou.gif) 对于shmop ![](/icons/28255dou.gif) 它把数据做了序列化 ![](/icons/28255dou.gif) 并用 ![](/icons/28255yi.gif) 个做为数据 ![](/icons/28255de.gif) 结束 ![](/icons/28255dou2.gif) ![](/icons/28255yinwei.gif) 序列化本身并不是很快 ![](/icons/28255dou.gif) 所以有可能 ![](/icons/28255de.gif) 话 ![](/icons/28255dou.gif) 还是sysv ![](/icons/28255de.gif) shm稳定 ![](/icons/28255yi.gif) 些 ![](/icons/28255dou2.gif) 共享内存 ![](/icons/28255de.gif) 原本用途并不是做缓存Cache ![](/icons/28255dou.gif) 也不是做buffer ![](/icons/28255dou.gif) 它是用来做进程间通信 ![](/icons/28255de.gif) ![](/icons/28255dou2.gif) 它可以保存临时队列 ![](/icons/28255dou.gif) 传递信号量等 ![](/icons/28255dou2.gif) 我们在这里变通地用它来保存点东西 ![](/icons/28255dou.gif) 只是 ![](/icons/28255yinwei.gif) 它 ![](/icons/28255de.gif) 速度快得实在不是文件和数据库存取能比 ![](/icons/28255de.gif) ![](/icons/28255dou2.gif) 而且 ![](/icons/28255yinwei.gif) 它 ![](/icons/28255de.gif) 共享性 ![](/icons/28255dou.gif) 它在 ![](/icons/28255yi.gif) 段web脚本结束的后不会消失 ![](/icons/28255dou.gif) 所以它特别适合用来实现Application变量(不用再羡慕ASP了)
相关文章
读者评论
发表评论
|
|