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