一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

DEDECMS|帝國CMS|Discuz|PHPCMS|Wordpress|ZBLOG|ECSHOP|蘋果CMS|極致CMS|CMS系統|

服務器之家 - 建站程序 - PHPCMS - phpcms緩存使用總結(memcached、eaccelerator、shm)

phpcms緩存使用總結(memcached、eaccelerator、shm)

2019-10-11 13:11phpcms教程網 PHPCMS

這篇文章主要介紹了phpcms中memcached、eaccelerator、shm緩存使用方法,需要的朋友可以參考下

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' => '公司白領</p> <p>魔法師</p> <p>科舉奪魁</p> <p>武將</p> <p>江湖奇俠',
'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';</p> <p>$placeid = intval($id);</p> <p>$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("")');</p> <p>$db->query("UPDATE ".TABLE_ADS." SET views=views+1 WHERE adsid=".$ads['adsid']);</p> <p>$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;
}</p> <p>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;
}</p> <p> function _get_file()
{
global $CONFIG;
//cache文件的主目錄一般是data/dbcache
return $CONFIG['dbcachedir'].substr($this->cache_id, 0, 2).'/'.$this->cache_id.'.php';
}</p> <p>function _is_expire()
{
global $PHP_TIME;
return !file_exists($this->cache_file) || ( $PHP_TIME > @filemtime($this->cache_file) + $this->expires );
}</p> <p>/*
由于方法_get_array只是被方法_query_cache調用,所以在此方法里面直接用函數mysql_unbuffered_query了,因為mysql_unbuffered性能好一點,參考
<a href="http://bbs.chinaunix.net/viewthread.php?tid=958067&extra=page%3D4">http://bbs.chinaunix.net/viewthread.php?tid=958067&extra=page%3D4</a>
*/
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;
}</p> <p>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);
}</p> <p> function _get_result()
{
return include $this->cache_file;
}</p> <p>function fetch_array($query, $result_type = MYSQL_ASSOC)
{
return $this->caching ? $this->_fetch_array($query) : mysql_fetch_array($query, $result_type);
}</p> <p>//從數據庫中獲取查詢的結果
function _fetch_array($result = array())
{
if($result) $this->result = $result;
return isset($this->result[$this->cursor]) ? $this->result[$this->cursor++] : FALSE;
}</p> <p>function num_rows($query)
{
return $this->caching ? $this->_num_rows($query) : mysql_num_rows($query);
}</p> <p>function free_result($query)
{
if($this->caching==1) $this->result = array();
else @mysql_free_result($query);
}

 

如果把上述的文件存儲改為用memcached、eaccelerator、shm等來進行存儲的話效率會更高,改動起來也不是太難,后臺可以加一個設置選項,如分別是
文件,memcached,eaccelerator,shm等讓管理員進行設置,然后調用相應的存儲系統進行存儲.

延伸 · 閱讀

精彩推薦
  • PHPCMSphpcms常見問題解答

    phpcms常見問題解答

    1.為什么phpcms首頁幻燈片怎么顯示不出來? 答:需要設置文章的 標題圖片 如果設置標題圖片,則可以在首頁以及欄目頁以圖片方式鏈接到文章。 2.自定義...

    phpcms教程網2712019-10-07
  • PHPCMSphpcms的欄目緩存無限級羅列展示處理代碼(親測)

    phpcms的欄目緩存無限級羅列展示處理代碼(親測)

    本文為大家詳細介紹下phpcms的欄目緩存無限級羅列展示是怎么實現的,粗測試了一下,效果還不錯,有需求的朋友可以參考下哈,希望對大家有所幫助 ...

    phpcms教程網8642019-10-11
  • PHPCMSphpcms V9實現QQ登陸OAuth2.0提供下載

    phpcms V9實現QQ登陸OAuth2.0提供下載

    phpcmsV9使用的QQ登陸依然是OAuth1.0,但現在騰訊已經不審核使用OAuth1.0的網站了。這對于使用pc的站長來講是一個無比巨大的坑。經過對phpcms論壇的一位同學做...

    phpcms教程網3402019-10-11
  • PHPCMS數據庫導入成功,phpcms打不開

    數據庫導入成功,phpcms打不開

    問:,數據庫導入成功,phpcms打不開 答:您好,查看此域名是解析到 云主機 上的,報錯來看應該是您導入的數據庫不完整,還差session的表,請您核實 若需...

    未知1822023-05-07
  • PHPCMSphpcms轉移到虛擬空間的詳細步驟

    phpcms轉移到虛擬空間的詳細步驟

    本文向大家介紹phpcms從本地轉移到虛擬空間的步驟,轉移過程需要改動一部分文件,這里提供如何改動這些文件,以保證你可以順利轉移PHPCMS ...

    phpcms教程網4232019-10-13
  • PHPCMSphpcms v9去除盛大連接 關閉盛大通行證的修改方法

    phpcms v9去除盛大連接 關閉盛大通行證的修改方法

    phpcms v9默認開啟了盛大連接,直接使用盛大通告證登錄網站,但是盛大通告證的覆蓋面有限,比不上QQ或者支付寶,甚至不如人人網、豆瓣之類,于是有朋...

    phpcms教程網5562019-10-13
  • PHPCMSphpcms怎么上傳歌曲文件

    phpcms怎么上傳歌曲文件

    phpcms上傳歌曲文件的方法:首先依次打開“設置-站點管理-修改”;然后在附件配置的“允許上傳附件類型”中添加自己需要的類型;接著打開“添加模型...

    未知1522023-05-07
  • PHPCMS如何設置PhpCms廣告模塊管理 PhpCms廣告模塊管理圖文教程

    如何設置PhpCms廣告模塊管理 PhpCms廣告模塊管理圖文教程

    PhpCms廣告模塊管理圖文教程,下面給大家總結一下 ...

    PHPCMS教程網3782019-10-14
主站蜘蛛池模板: ak福利影院 | 免费被靠视频动漫 | 亚洲haose在线观看 | 国产一卡2卡3卡4卡公司科普 | 国产精品露脸国语对白河北 | 亚洲精彩视频在线观看 | 国产播放啪视频免费视频 | 扒开腿开嫩苞 | 亚洲精品国产乱码AV在线观看 | 欧美女孩videos| 好大好深好涨好烫还要 | 国产精品午夜久久 | 亚洲成年网站在线观看 | 韩日视频在线观看 | 好男人资源免费播放在线观看 | 人人澡 人人澡碰人人看软件 | 精品国产日韩一区三区 | 日本ww视频 | 国产一级视频在线观看 | 校园春色偷拍自拍 | 特级淫片大乳女子高清视频 | 日本mv精品中文字幕 | 精品一区二区91 | 精品久久久久久久久免费影院 | 成人性生交小说免费看 | 男女男精品视频网站 | 高清在线免费观看 | 五月桃花网婷婷亚洲综合 | 美艳教师刘艳第三部166 | 楚乔传第二部免费观看全集完整版 | hh99me福利毛片 | 久久re视频精品538在线 | 亚洲 欧美 国产 在线 日韩 | 成年人免费在线视频 | 国产亚洲综合久久 | 国产自拍视频网站 | 美女全身体光羞羞漫画 | 狠狠干2016 | 波多野结衣同性系列698 | 6个老师的尿奴 | 亚洲va在线va天堂va偷拍 |