专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »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种是sysvshm区别是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它把数据做了序列化并用个做为数据结束序列化本身并不是很快所以有可能还是sysvshm稳定



  共享内存原本用途并不是做缓存Cache也不是做buffer它是用来做进程间通信它可以保存临时队列传递信号量等我们在这里变通地用它来保存点东西只是速度快得实在不是文件和数据库存取能比而且共享性它在段web脚本结束的后不会消失所以它特别适合用来实现Application变量(不用再羡慕ASP了)



相关文章

读者评论

  • 共0条 分0页

发表评论

  • 昵称:
  • 内容: