- 浏览: 564776 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (618)
- java (109)
- Java web (43)
- javascript (52)
- js (15)
- 闭包 (2)
- maven (8)
- 杂 (28)
- python (47)
- linux (51)
- git (18)
- (1)
- mysql (31)
- 管理 (1)
- redis (6)
- 操作系统 (12)
- 网络 (13)
- mongo (1)
- nginx (17)
- web (8)
- ffmpeg (1)
- python安装包 (0)
- php (49)
- imagemagic (1)
- eclipse (21)
- django (4)
- 学习 (1)
- 书籍 (1)
- uml (3)
- emacs (19)
- svn (2)
- netty (9)
- joomla (1)
- css (1)
- 推送 (2)
- android (6)
- memcached (2)
- docker、 (0)
- docker (7)
- go (1)
- resin (1)
- groovy (1)
- spring (1)
最新评论
-
chokee:
...
Spring3 MVC 深入研究 -
googleyufei:
很有用, 我现在打算学学Python. 这些资料的很及时.
python的几个实用网站(转的) -
hujingwei1001:
太好了找的就是它
easy explore -
xiangtui:
例子举得不错。。。学习了
java callback -
幻影桃花源:
太好了,謝謝
Spring3 MVC 深入研究
原文地址:http://blog.csdn.net/painsonline/article/details/7683182
phpcms使用的缓存方式总结
a.模板编译缓存
参考文件include/global.func.php及include/template.func.php
模板编译缓存的原理其实很简单,如果模板是第一次编译,则直接编译它,如果不是第一次编译,则比较模板文件($tplfile)及模板缓存文件 ($compiledtplfile)的修改时间,如果模板文件的修改时间大于编译过的模板缓存文件,则编译模板,否则不编译模板,提高了程序的执行效率。
function template($module = 'phpcms', $template = 'index')
{
global $CONFIG;
$compiledtplfile = $CONFIG['templatescachedir'].$module.'_'.$template.'.tpl.php';
if($CONFIG['templaterefresh'])
{
$tplfile = PHPCMS_ROOT.'/templates/'.$CONFIG['defaulttemplate'].'/'.$module.'/'.$template.'.html';
if(!file_exists($compiledtplfile) || @filemtime($tplfile) > @filemtime($compiledtplfile))
{
require_once PHPCMS_ROOT.'/include/template.func.php';
template_refresh($tplfile, $compiledtplfile);
}
}
return $compiledtplfile;
}
b.在动态页面里面产生静态的缓存文件
与c的缓存原理类似,只是此处生成的文件名相对固定
以问吧模块为例进行说明
用http://www.chf.com/opensource/phpcms2007_sp6_gbk/phpcms/wenba/进行访问
此目录下有个index.php文件,判断当前目录下是否存在名为index_cache.html的文件,如果有没有过失效期,则直接包含此文件,否则动态地读取完数据后保存为index_cache.html文件,以备下次使用。
文件index.php中的内容:
<?php
require_once './include/common.inc.php';
$lastedittime = @filemtime('index_cache.html');
$lastedittime = $PHP_TIME-$lastedittime;
$autoupdatetime = intval($MOD['autoupdate']); //$MOD['autoupdate']来自缓存文件data/cache/wenba_setting.php中的内容
if(file_exists('index_cache.html') && $lastedittime<$autoupdatetime)
{
echo "include cache file";
include 'index_cache.html';
}
else
{
echo "read dynamic page";
...
?>
怎么判断文件是否失效呢,文件data/cache/wenba_setting.php中有如下的设置,其中字段autoupdate的值就是文件失效的时间,单位是秒,在后台可以进行设置
文件wenba_setting.php是从哪儿来的呢,进行安装时自动把各种模块的数据保存到数据库中了,安装时就生成缓存数据了,在include/common.inc.php中函数cache_all也可以生成缓存,后台进行设置时cache会自动更新的
<?php
return array (
'higth_score' => '100',
'anybody_score' => '2',
'answer_give_credit' => '5',
'vote_give_credit' => '1',
'highscore' => '2',
'vote_give_actor' => '公司白领
魔法师
科举夺魁
武将
江湖奇侠',
'autoupdate' => '10',
'name' => '问吧',
'moduledir' => 'wenba',
'moduledomain' => '',
'linkurl' => '/opensource/phpcms2007_sp6_gbk/phpcms/wenba/',
);
?>
include/global.func.php
更新模块设置函数
function module_setting($module, $setting)
{
global $db,$MODULE,$LANG;
if(!is_array($setting) || !array_key_exists($module,$MODULE)) return FALSE;
if(isset($setting['moduledomain']))
{
$moduledomain = $setting['moduledomain'];
$db->query("UPDATE ".TABLE_MODULE." SET moduledomain='$moduledomain' WHERE module='$module'");
unset($setting['moduledomain']);
}
$setting = addslashes(serialize(new_stripslashes($setting)));
//将某个模块的多个设置的值经数组序列化以后保存在一个字段setting中
$db->query("UPDATE ".TABLE_MODULE." SET setting='$setting' WHERE module='$module'");
cache_module($module);
cache_common();
return TRUE;
}
c.在动态页面里面产生静态的缓存文件
与b的缓存原理类似,只是此处生成的文件名是根据计算$PHP_SELF与$PHP_QUERYSTRING的md5值生成的文件名,相对于所有php动态页面来说都是一样的,这个思想比较精典,值得借签
以问吧模块为例进行说明
文件调用顺序为:index.php -> js.php -> ad.php -> global.func.php
用http://www.chf.com/opensource/phpcms2007_sp6_gbk/phpcms/wenba/进行访问
此目录下有个index.php文件,判断当前目录下是否存在名为index_cache.html的文件,如果有,则直接包含此文件,如果不存在此文件,则动态地读取完数据后保存在index_cache.html文件,以备下次使用
用上述的url访问时,页面里面包含有如下的一行js代码
<script language="javascript" src="/opensource/phpcms2007_sp6_gbk/phpcms/data/js.php?id=1"></script>
此js代码其实就是动态调用php页面的内容
http://www.chf.com/opensource/phpcms2007_sp6_gbk/phpcms/data/js.php?id=1
js.php文件的内容:
<?php
chdir('../ads/');
require './ad.php';
?>
ad.php的内容:
<?php
define('SHOWJS', 1);
require './include/common.inc.php';
require MOD_ROOT.'/include/global.func.php';
$placeid = intval($id);
$query ="SELECT * FROM ".TABLE_ADS." AS a LEFT JOIN ".TABLE_ADS_PLACE." AS p ON (a.placeid=p.placeid) WHERE a.placeid=".$placeid." AND a.fromdate<=UNIX_TIMESTAMP() AND a.todate>=UNIX_TIMESTAMP() AND p.passed=1 AND a.passed=1 AND a.checked=1 ORDER BY a.addtime";
$ads = $db->get_one($query, "CAHCE", 10240);
if(!$ads) exit('document.write("")');
$db->query("UPDATE ".TABLE_ADS." SET views=views+1 WHERE adsid=".$ads['adsid']);
$content = ads_content($ads);
$templateid = $ads['templateid'] ? $ads['templateid'] : 'ads';
include template('ads', $templateid);
phpcache();
?>
ad.php里面调用了phpcache函数,参考文件include/global.func.php
function phpcache($is_js = 0)
{
global $CONFIG,$cachefiledir,$cachefile;
if(!$is_js && $CONFIG['phpcache'] != '2') return FALSE;
$contents = ob_get_clean(); //读取缓冲区里面的内容
if($is_js) $contents = strip_js($contents);
if($CONFIG['phpcache'] == '2' && $cachefiledir && $cachefile)
{
dir_create($cachefiledir);
file_put_contents($cachefile, $contents); //在这儿生成一个.html格式的文件,当下次以同样的url访问时,会直接读取缓存了,参见include/common.inc.php中的代码,这儿的代码是非常非常精典的,大家好好借鉴、好好模仿吧
@chmod($cachefile, 0777);
}
/*
向浏览器发送http header,跟浏览器说,此页面不缓存,还告诉浏览器页面的最后修改时间
第一次访问js.php?id=1时向浏览器发送http header,第二次或以后再访问此url时,由于上次已经生成了缓存,所以在include/common.inc.php中直接调用缓存文件了,直到 缓存失效后再次执行此处的动态代码。此处发送的header控制缓存是相对于浏览器来说的;而通过file_put_contents生成的缓存是相对于 电脑硬盘来说的,是不一样的。
*/
header('Expires: Mon, 26 Jul 2000 05:00:00 GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Cache-Control: no-cache, must-revalidate');
header('Pragma: no-cache');
echo $contents;
}
上面的phpcache函数中的全局变量$cachefiledir,$cachefile是从哪里来的呢,从这儿来的
文件include/common.inc.php中的内容
if(!defined('IN_ADMIN'))
{
if($CONFIG['dbiscache']) $db_file .= '_cache';
if($CONFIG['phpcache'] == '2')
{
$cachefileid = md5($PHP_SELF.'?'.$PHP_QUERYSTRING);
$cachefiledir = PHPCMS_ROOT.'/data/phpcache/'.substr($cachefileid, 0, 2).'/';
$cachefile = $cachefiledir.$cachefileid.'.html';
//echo "cachefile:$cachefile";
if(file_exists($cachefile) && ($PHP_TIME < @filemtime($cachefile) + $CONFIG['phpcacheexpires']))
{
require $cachefile;
exit;
}
}
if($PHP_QUERYSTRING && preg_match("/^(.*)\.(htm|html|shtm|shtml)$/", $PHP_QUERYSTRING, $urlvar))
{
parse_str(str_replace(array('/', '-', ' '), array('&', '=', ''), $urlvar[1]));
}
}
d.数据库查询结果缓存
下面是include/common.inc.php中的几行代码
$db_file = $db_class = 'db_'.$CONFIG['database']; //$CONFIG['database']位于config.inc.php中,配置可以使用自己的数据库,如mysql,sqlite,sqlserver等
require PHPCMS_ROOT.'/include/'.$db_file.'.class.php';
$db = new $db_class;
$db->connect($CONFIG['dbhost'], $CONFIG['dbuser'], $CONFIG['dbpw'], $CONFIG['dbname'], $CONFIG['pconnect']);
$db->iscache = $CONFIG['dbiscache']; //是否启用 sql cache (只对前台起作用,建议在不生成html并且访问量过大时开启)
$db->expires = $CONFIG['dbexpires']; //sql cache 过期时间(秒)
db_mysql_cache.class.php中的代码
function query($sql , $type = '' , $expires = 3600, $dbname = '')
{
if($this->isclient)
{
$dbname = $dbname ? $dbname : $this->dbname;
$this->select_db($dbname);
}
/*
$this->iscache表示是否启动了数据库查询缓存
如果启用了数据库查询缓存且$type为CACHE且是select语句,则启用查询缓存
个人感觉这儿$type参数用strtoupper处理一下更好了
*/
if($this->iscache && $type == 'CACHE' && stristr($sql, 'SELECT'))
{
$this->caching = 1; //成员变量caching标识启用了数据库查询缓存,用在下面的fetch_array,num_rows,free_result函数中,其实用iscache就可以判断了,没有必要再用一个成员变量了
$this->expires = $expires; //数据库缓存数据的失效期
return $this->_query_cache($sql); //然后调用_query_cache方法
}
$this->caching = 0;
$func = $type == 'UNBUFFERED' ? 'mysql_unbuffered_query' : 'mysql_query';
if(!($query = $func($sql , $this->connid)) && $type != 'SILENT')
{
$this->halt('MySQL Query Error', $sql);
}
$this->querynum++;
return $query;
}
function _query_cache($sql)
{
$this->cache_id = md5($sql); //计算$sql的md5值,然后作为cache_id
$this->result = array();
$this->cursor = 0;
$this->cache_file = $this->_get_file(); //得到cache文件名
//如果cache数据已经过期,则重新从数据库中取得查询结果,然后保存在数据库中
if($this->_is_expire())
{
$this->result = $this->_get_array($sql); //从数据库中取结果
$this->_save_result(); //保存结果到缓存数据中
}
else
{
$this->result = $this->_get_result(); //缓存没过期直接取缓存数据
}
return $this->result;
}
function _get_file()
{
global $CONFIG;
//cache文件的主目录一般是data/dbcache
return $CONFIG['dbcachedir'].substr($this->cache_id, 0, 2).'/'.$this->cache_id.'.php';
}
function _is_expire()
{
global $PHP_TIME;
return !file_exists($this->cache_file) || ( $PHP_TIME > @filemtime($this->cache_file) + $this->expires );
}
/*
由于方法_get_array只是被方法_query_cache调用,所以在此方法里面直接用函数mysql_unbuffered_query了,因为mysql_unbuffered性能好一点,参考
http://bbs.chinaunix.net/viewthread.php?tid=958067&extra=page%3D4
*/
function _get_array($sql)
{
$this->cursor = 0;
$arr = array();
$result = mysql_unbuffered_query($sql, $this->connid);
while($row = mysql_fetch_assoc($result))
{
$arr[] = $row;
}
$this->free_result($result);
$this->querynum++;
return $arr;
}
function _save_result()
{
if(!is_array($this->result)) return FALSE;
dir_create(dirname($this->cache_file));
file_put_contents($this->cache_file, "<?php\n return ".var_export($this->result, TRUE).";\n?>");
@chmod($this->cache_file, 0777);
}
function _get_result()
{
return include $this->cache_file;
}
function fetch_array($query, $result_type = MYSQL_ASSOC)
{
return $this->caching ? $this->_fetch_array($query) : mysql_fetch_array($query, $result_type);
}
//从数据库中获取查询的结果
function _fetch_array($result = array())
{
if($result) $this->result = $result;
return isset($this->result[$this->cursor]) ? $this->result[$this->cursor++] : FALSE;
}
function num_rows($query)
{
return $this->caching ? $this->_num_rows($query) : mysql_num_rows($query);
}
function free_result($query)
{
if($this->caching==1) $this->result = array();
else @mysql_free_result($query);
}
如果把上述的文件存储改为用memcached、eaccelerator、shm等来进行存储的话效率会更高,改动起来也不是太难,后台可以加一个设置选项,如分别是
文件,memcached,eaccelerator,shm等让管理员进行设置,然后调用相应的存储系统进行存储
phpcms使用的缓存方式总结
a.模板编译缓存
参考文件include/global.func.php及include/template.func.php
模板编译缓存的原理其实很简单,如果模板是第一次编译,则直接编译它,如果不是第一次编译,则比较模板文件($tplfile)及模板缓存文件 ($compiledtplfile)的修改时间,如果模板文件的修改时间大于编译过的模板缓存文件,则编译模板,否则不编译模板,提高了程序的执行效率。
function template($module = 'phpcms', $template = 'index')
{
global $CONFIG;
$compiledtplfile = $CONFIG['templatescachedir'].$module.'_'.$template.'.tpl.php';
if($CONFIG['templaterefresh'])
{
$tplfile = PHPCMS_ROOT.'/templates/'.$CONFIG['defaulttemplate'].'/'.$module.'/'.$template.'.html';
if(!file_exists($compiledtplfile) || @filemtime($tplfile) > @filemtime($compiledtplfile))
{
require_once PHPCMS_ROOT.'/include/template.func.php';
template_refresh($tplfile, $compiledtplfile);
}
}
return $compiledtplfile;
}
b.在动态页面里面产生静态的缓存文件
与c的缓存原理类似,只是此处生成的文件名相对固定
以问吧模块为例进行说明
用http://www.chf.com/opensource/phpcms2007_sp6_gbk/phpcms/wenba/进行访问
此目录下有个index.php文件,判断当前目录下是否存在名为index_cache.html的文件,如果有没有过失效期,则直接包含此文件,否则动态地读取完数据后保存为index_cache.html文件,以备下次使用。
文件index.php中的内容:
<?php
require_once './include/common.inc.php';
$lastedittime = @filemtime('index_cache.html');
$lastedittime = $PHP_TIME-$lastedittime;
$autoupdatetime = intval($MOD['autoupdate']); //$MOD['autoupdate']来自缓存文件data/cache/wenba_setting.php中的内容
if(file_exists('index_cache.html') && $lastedittime<$autoupdatetime)
{
echo "include cache file";
include 'index_cache.html';
}
else
{
echo "read dynamic page";
...
?>
怎么判断文件是否失效呢,文件data/cache/wenba_setting.php中有如下的设置,其中字段autoupdate的值就是文件失效的时间,单位是秒,在后台可以进行设置
文件wenba_setting.php是从哪儿来的呢,进行安装时自动把各种模块的数据保存到数据库中了,安装时就生成缓存数据了,在include/common.inc.php中函数cache_all也可以生成缓存,后台进行设置时cache会自动更新的
<?php
return array (
'higth_score' => '100',
'anybody_score' => '2',
'answer_give_credit' => '5',
'vote_give_credit' => '1',
'highscore' => '2',
'vote_give_actor' => '公司白领
魔法师
科举夺魁
武将
江湖奇侠',
'autoupdate' => '10',
'name' => '问吧',
'moduledir' => 'wenba',
'moduledomain' => '',
'linkurl' => '/opensource/phpcms2007_sp6_gbk/phpcms/wenba/',
);
?>
include/global.func.php
更新模块设置函数
function module_setting($module, $setting)
{
global $db,$MODULE,$LANG;
if(!is_array($setting) || !array_key_exists($module,$MODULE)) return FALSE;
if(isset($setting['moduledomain']))
{
$moduledomain = $setting['moduledomain'];
$db->query("UPDATE ".TABLE_MODULE." SET moduledomain='$moduledomain' WHERE module='$module'");
unset($setting['moduledomain']);
}
$setting = addslashes(serialize(new_stripslashes($setting)));
//将某个模块的多个设置的值经数组序列化以后保存在一个字段setting中
$db->query("UPDATE ".TABLE_MODULE." SET setting='$setting' WHERE module='$module'");
cache_module($module);
cache_common();
return TRUE;
}
c.在动态页面里面产生静态的缓存文件
与b的缓存原理类似,只是此处生成的文件名是根据计算$PHP_SELF与$PHP_QUERYSTRING的md5值生成的文件名,相对于所有php动态页面来说都是一样的,这个思想比较精典,值得借签
以问吧模块为例进行说明
文件调用顺序为:index.php -> js.php -> ad.php -> global.func.php
用http://www.chf.com/opensource/phpcms2007_sp6_gbk/phpcms/wenba/进行访问
此目录下有个index.php文件,判断当前目录下是否存在名为index_cache.html的文件,如果有,则直接包含此文件,如果不存在此文件,则动态地读取完数据后保存在index_cache.html文件,以备下次使用
用上述的url访问时,页面里面包含有如下的一行js代码
<script language="javascript" src="/opensource/phpcms2007_sp6_gbk/phpcms/data/js.php?id=1"></script>
此js代码其实就是动态调用php页面的内容
http://www.chf.com/opensource/phpcms2007_sp6_gbk/phpcms/data/js.php?id=1
js.php文件的内容:
<?php
chdir('../ads/');
require './ad.php';
?>
ad.php的内容:
<?php
define('SHOWJS', 1);
require './include/common.inc.php';
require MOD_ROOT.'/include/global.func.php';
$placeid = intval($id);
$query ="SELECT * FROM ".TABLE_ADS." AS a LEFT JOIN ".TABLE_ADS_PLACE." AS p ON (a.placeid=p.placeid) WHERE a.placeid=".$placeid." AND a.fromdate<=UNIX_TIMESTAMP() AND a.todate>=UNIX_TIMESTAMP() AND p.passed=1 AND a.passed=1 AND a.checked=1 ORDER BY a.addtime";
$ads = $db->get_one($query, "CAHCE", 10240);
if(!$ads) exit('document.write("")');
$db->query("UPDATE ".TABLE_ADS." SET views=views+1 WHERE adsid=".$ads['adsid']);
$content = ads_content($ads);
$templateid = $ads['templateid'] ? $ads['templateid'] : 'ads';
include template('ads', $templateid);
phpcache();
?>
ad.php里面调用了phpcache函数,参考文件include/global.func.php
function phpcache($is_js = 0)
{
global $CONFIG,$cachefiledir,$cachefile;
if(!$is_js && $CONFIG['phpcache'] != '2') return FALSE;
$contents = ob_get_clean(); //读取缓冲区里面的内容
if($is_js) $contents = strip_js($contents);
if($CONFIG['phpcache'] == '2' && $cachefiledir && $cachefile)
{
dir_create($cachefiledir);
file_put_contents($cachefile, $contents); //在这儿生成一个.html格式的文件,当下次以同样的url访问时,会直接读取缓存了,参见include/common.inc.php中的代码,这儿的代码是非常非常精典的,大家好好借鉴、好好模仿吧
@chmod($cachefile, 0777);
}
/*
向浏览器发送http header,跟浏览器说,此页面不缓存,还告诉浏览器页面的最后修改时间
第一次访问js.php?id=1时向浏览器发送http header,第二次或以后再访问此url时,由于上次已经生成了缓存,所以在include/common.inc.php中直接调用缓存文件了,直到 缓存失效后再次执行此处的动态代码。此处发送的header控制缓存是相对于浏览器来说的;而通过file_put_contents生成的缓存是相对于 电脑硬盘来说的,是不一样的。
*/
header('Expires: Mon, 26 Jul 2000 05:00:00 GMT');
header('Last-Modified: '.gmdate('D, d M Y H:i:s').' GMT');
header('Cache-Control: no-cache, must-revalidate');
header('Pragma: no-cache');
echo $contents;
}
上面的phpcache函数中的全局变量$cachefiledir,$cachefile是从哪里来的呢,从这儿来的
文件include/common.inc.php中的内容
if(!defined('IN_ADMIN'))
{
if($CONFIG['dbiscache']) $db_file .= '_cache';
if($CONFIG['phpcache'] == '2')
{
$cachefileid = md5($PHP_SELF.'?'.$PHP_QUERYSTRING);
$cachefiledir = PHPCMS_ROOT.'/data/phpcache/'.substr($cachefileid, 0, 2).'/';
$cachefile = $cachefiledir.$cachefileid.'.html';
//echo "cachefile:$cachefile";
if(file_exists($cachefile) && ($PHP_TIME < @filemtime($cachefile) + $CONFIG['phpcacheexpires']))
{
require $cachefile;
exit;
}
}
if($PHP_QUERYSTRING && preg_match("/^(.*)\.(htm|html|shtm|shtml)$/", $PHP_QUERYSTRING, $urlvar))
{
parse_str(str_replace(array('/', '-', ' '), array('&', '=', ''), $urlvar[1]));
}
}
d.数据库查询结果缓存
下面是include/common.inc.php中的几行代码
$db_file = $db_class = 'db_'.$CONFIG['database']; //$CONFIG['database']位于config.inc.php中,配置可以使用自己的数据库,如mysql,sqlite,sqlserver等
require PHPCMS_ROOT.'/include/'.$db_file.'.class.php';
$db = new $db_class;
$db->connect($CONFIG['dbhost'], $CONFIG['dbuser'], $CONFIG['dbpw'], $CONFIG['dbname'], $CONFIG['pconnect']);
$db->iscache = $CONFIG['dbiscache']; //是否启用 sql cache (只对前台起作用,建议在不生成html并且访问量过大时开启)
$db->expires = $CONFIG['dbexpires']; //sql cache 过期时间(秒)
db_mysql_cache.class.php中的代码
function query($sql , $type = '' , $expires = 3600, $dbname = '')
{
if($this->isclient)
{
$dbname = $dbname ? $dbname : $this->dbname;
$this->select_db($dbname);
}
/*
$this->iscache表示是否启动了数据库查询缓存
如果启用了数据库查询缓存且$type为CACHE且是select语句,则启用查询缓存
个人感觉这儿$type参数用strtoupper处理一下更好了
*/
if($this->iscache && $type == 'CACHE' && stristr($sql, 'SELECT'))
{
$this->caching = 1; //成员变量caching标识启用了数据库查询缓存,用在下面的fetch_array,num_rows,free_result函数中,其实用iscache就可以判断了,没有必要再用一个成员变量了
$this->expires = $expires; //数据库缓存数据的失效期
return $this->_query_cache($sql); //然后调用_query_cache方法
}
$this->caching = 0;
$func = $type == 'UNBUFFERED' ? 'mysql_unbuffered_query' : 'mysql_query';
if(!($query = $func($sql , $this->connid)) && $type != 'SILENT')
{
$this->halt('MySQL Query Error', $sql);
}
$this->querynum++;
return $query;
}
function _query_cache($sql)
{
$this->cache_id = md5($sql); //计算$sql的md5值,然后作为cache_id
$this->result = array();
$this->cursor = 0;
$this->cache_file = $this->_get_file(); //得到cache文件名
//如果cache数据已经过期,则重新从数据库中取得查询结果,然后保存在数据库中
if($this->_is_expire())
{
$this->result = $this->_get_array($sql); //从数据库中取结果
$this->_save_result(); //保存结果到缓存数据中
}
else
{
$this->result = $this->_get_result(); //缓存没过期直接取缓存数据
}
return $this->result;
}
function _get_file()
{
global $CONFIG;
//cache文件的主目录一般是data/dbcache
return $CONFIG['dbcachedir'].substr($this->cache_id, 0, 2).'/'.$this->cache_id.'.php';
}
function _is_expire()
{
global $PHP_TIME;
return !file_exists($this->cache_file) || ( $PHP_TIME > @filemtime($this->cache_file) + $this->expires );
}
/*
由于方法_get_array只是被方法_query_cache调用,所以在此方法里面直接用函数mysql_unbuffered_query了,因为mysql_unbuffered性能好一点,参考
http://bbs.chinaunix.net/viewthread.php?tid=958067&extra=page%3D4
*/
function _get_array($sql)
{
$this->cursor = 0;
$arr = array();
$result = mysql_unbuffered_query($sql, $this->connid);
while($row = mysql_fetch_assoc($result))
{
$arr[] = $row;
}
$this->free_result($result);
$this->querynum++;
return $arr;
}
function _save_result()
{
if(!is_array($this->result)) return FALSE;
dir_create(dirname($this->cache_file));
file_put_contents($this->cache_file, "<?php\n return ".var_export($this->result, TRUE).";\n?>");
@chmod($this->cache_file, 0777);
}
function _get_result()
{
return include $this->cache_file;
}
function fetch_array($query, $result_type = MYSQL_ASSOC)
{
return $this->caching ? $this->_fetch_array($query) : mysql_fetch_array($query, $result_type);
}
//从数据库中获取查询的结果
function _fetch_array($result = array())
{
if($result) $this->result = $result;
return isset($this->result[$this->cursor]) ? $this->result[$this->cursor++] : FALSE;
}
function num_rows($query)
{
return $this->caching ? $this->_num_rows($query) : mysql_num_rows($query);
}
function free_result($query)
{
if($this->caching==1) $this->result = array();
else @mysql_free_result($query);
}
如果把上述的文件存储改为用memcached、eaccelerator、shm等来进行存储的话效率会更高,改动起来也不是太难,后台可以加一个设置选项,如分别是
文件,memcached,eaccelerator,shm等让管理员进行设置,然后调用相应的存储系统进行存储
发表评论
-
关于PHP堆栈与列队的学习
2015-05-25 15:48 765原文地址:http://www.jb51.net/articl ... -
PHP中的ob_start用法详解
2015-03-13 17:57 741原文地址:http://www.jcwcn ... -
PHP 真正多线程的使用
2015-01-30 13:36 477原文地址:http://zyan.cc/pthreads/ ... -
深入解析PHP中的(伪)多线程与多进程
2015-01-30 13:33 534原文地址:http://www.jb51.net/articl ... -
细说Drupal,Joomla,Wordpress的区别
2015-01-27 17:56 1938原文地址:http://xiangfeipy.blog.163 ... -
Joomla 和 Drupal 的比较(之二)
2015-01-27 17:19 1174原文地址:http://blog.chin ... -
PHP中spl_autoload_register函数的用法
2015-01-20 10:34 992原文地址:http://www.cnblogs.com/myl ... -
PHP5中的this,self和parent关键字详解
2014-12-30 11:21 478原文地址:http://www.hbjjrb.com/Jish ... -
查看字符串编码
2014-12-26 16:56 529原文地址:http://zhidao.baidu.com/li ... -
【问底】徐汉彬:PHP7和HHVM的性能之争
2014-12-26 15:41 675原文地址:http://www.iteye ... -
模块详细缓存
2014-12-10 17:59 627原文地址:http://www.phpcms.cn/doc/P ... -
【phpcms-v9】缓存目录caches下的各个文件的作用
2014-12-09 13:45 638原文地址:http://blog.csdn.net/yanhu ... -
Emacs 中的查找
2014-12-03 18:03 505原文地址:http://emacser.c ... -
使用phpize建立php扩展 Cannot find config.m4.
2014-12-03 14:31 634原文地址:http://lxsym.blog.51cto.co ... -
Ubuntu环境下的php-Redis 配置与php使用入门
2014-12-03 14:18 599原文地址:http://www.linuxidc.com/Li ... -
Ubuntu下安装php扩展
2014-11-27 15:31 478原文地址:http://koda.itey ... -
解决apache启动错误"httpd:Could not reliably determine..."
2014-11-27 14:02 524原文地址:http://www.2cto.com/os/201 ... -
Ubuntu下配置PHP开发环境
2014-11-27 13:25 581原文地址:http://blog.sina ... -
Ubuntu下的PHP开发环境架设
2014-11-25 17:38 552原文地址:http://www.cnblo ... -
PHP时间戳函数总结一览(转)
2014-10-30 10:51 522原文地址:http://www.cnblogs.com/che ...
相关推荐
在对phpcms缓存使用进行总结时,主要涉及到了三种缓存机制:Memcached、eAccelerator和shm。它们都用于优化phpcms的性能,具体来说,包括模板编译缓存、动态页面静态缓存以及模块数据缓存等。下面将详细阐述这些缓存...
2. **缓存机制**:合理使用phpcms的缓存功能,提高系统性能。 3. **SEO优化**:合理设置关键词、描述,提升搜索引擎友好性。 4. **版本更新**:定期关注phpcms官方更新,及时修复安全漏洞,升级新功能。 最后,关于...
总结,了解phpcms的文件目录结构是进行二次开发的基础,这有助于我们更好地理解系统的运行机制,定制功能,以及优化性能。深入学习和理解每个目录的作用,以及它们之间的相互关系,对于phpcms的高效使用和维护至关...
总结,PHPCMS的源代码解析涉及到的内容广泛,包括MVC架构的理解、数据库操作、模板引擎的使用、缓存机制、安全防护以及权限控制等方面。通过深入学习和实践,开发者可以更好地利用PHPCMS构建高效、安全的网站。
总结,phpcms地区数据库表是其内容管理系统中的关键组成部分,涉及到网站的地域信息管理。理解和掌握地区表的结构、扩展方法以及在实际应用中的操作,对提升phpcms网站的功能和用户体验至关重要。
- **缓存管理**:为了提高性能,phpCMS通常会使用缓存机制来存储频繁访问的数据。因此,在设计自定义标签时,需要考虑到缓存的有效期和更新机制。 - **错误处理**:在自定义标签的实现过程中,应充分考虑可能出现的...
在phpcms_v9中使用UTF8编码,确保了多语言网站的正常运行和数据的一致性,避免了乱码问题。 2. **phpcms_v9框架结构** phpcms_v9采用MVC(Model-View-Controller)设计模式,将业务逻辑、数据模型和用户界面分离,...
总结,医疗网phpcmsv9提供了构建专业医疗网站的强大工具,通过理解其特性和源码结构,开发者可以高效地搭建出符合医疗行业需求的网站,同时兼顾用户体验和功能性。在实际操作中,还需结合医疗行业的特殊性,进行定制...
**phpcms2008帮助手册** ...总结来说,`phpcms2008`是一个功能齐全、易用性强的内容管理系统,适合有一定PHP基础的开发者和网站管理员。通过深入学习和实践,可以灵活地搭建和管理各类网站,满足不同业务需求。
**phpcms文章系统详解** ...总结,phpcms文章系统以其易用性、功能全面和良好的扩展性,成为了许多企业和个人搭建门户网站的首选。通过对系统深入理解和实践,我们可以创建出满足各种需求的高质量网站。
总结来说,phpcms2008作为一款高效的内容管理系统,不仅提供了丰富的功能,还具备高度的可扩展性和易用性。对于开发者而言,理解和掌握phpcms2008的源代码,能够更好地进行二次开发和维护,从而提升工作效率,打造出...
在 PHPCMS V9 中,PC 标签是获取数据的主要方式。它们以 `{pc}` 开头,以 `{/pc}` 结尾,如示例所示: ``` {pc:content action="lists" cache="3600" num="20" page="$page"} {/pc} ``` PC 标签的使用需要注意两个...
总结来说,phpcmsv9的投稿统计功能是内容管理的重要组成部分,它提供了全面的数据支持,帮助管理员优化内容策略,提升用户体验,同时也是评估和激励用户贡献的有效工具。通过对各项数据的深入分析,网站管理者可以更...
总结,phpcms凭借其强大的功能、友好的用户界面和开源特性,成为了众多企业和个人建站的首选。掌握phpcms的使用,不仅能够提高网站的建设和管理效率,还能灵活应对各种业务需求。无论是新手还是经验丰富的开发者,都...
在phpcms V9中,使用UTF-8编码可以支持多种语言,这对于构建全球化网站至关重要。在进行后台修改时,需确保所有文件编码的一致性,以避免乱码问题。 二次开发是指在原有软件的基础上进行扩展或改进,以满足特定需求...
PHPCMS V9 使用基于模块和操作的访问方式。访问 URL 时需要指定模型(m)、控制器(c)和方法(a)。例如一个典型的模块访问 URL 格式如下: ``` *** ``` 其中,`m` 代表模块名称,`c` 代表控制器名称,`a` 代表具体...
#### 三、总结 通过对以上常用函数的详细解析,我们可以看出PHPCMS v9提供了丰富的API来简化开发工作。开发者可以根据自己的需求灵活运用这些函数,以实现高效、稳定的二次开发。在实际项目中,还需要结合具体场景和...