PHP緩存原理及使用方法
PHP由于它的強(qiáng)大和可伸縮性,近幾年來得到長(zhǎng)足的發(fā)展,PHP相比傳統(tǒng)的ASP網(wǎng)站,在速度上有絕對(duì)的
優(yōu)勢(shì),想mssql轉(zhuǎn)6萬條數(shù)據(jù)PHP如需要40秒,ASP不下2分鐘.但是,由于網(wǎng)站的數(shù)據(jù)越來越多,我們渴求能更快速的調(diào)用數(shù)據(jù),不必要每次都從數(shù)據(jù)
庫掉,我們可以從其他的地方,比方一個(gè)文件,或者某個(gè)內(nèi)存地址,這就是PHP的緩存技術(shù),也就是Cache技術(shù)。
分析深入
一般來說,緩存的目的是把數(shù)據(jù)放在一個(gè)地方讓訪問的更快點(diǎn),毫無疑問,內(nèi)存是最快的,但是,幾百M(fèi)的數(shù)據(jù)能往內(nèi)存放么?這不現(xiàn)實(shí),當(dāng)然,有的時(shí)
候臨時(shí)放如服務(wù)器緩存,如ob_start()這個(gè)緩存頁面開啟的話在發(fā)送文件頭之前頁面內(nèi)容都被緩存在內(nèi)存中,知道等頁面輸出自動(dòng)清楚或者等待
ob_get_contents的返回,或者被ob_end_clean顯示的清除,這在靜態(tài)頁面的生成中能很好的利用,在模板中能得到很好的體現(xiàn)。
另外,在ASP中有一對(duì)象application,可以保存公用的參數(shù),這也算點(diǎn)緩存,但在PHP,我至今沒看到開發(fā)者產(chǎn)出這種對(duì)象,的確,沒
必要.ASP.NET的頁面緩存技術(shù)就用的是viewstate,而cache就是文件關(guān)聯(lián),(不一定準(zhǔn)確),文件被修改,更新緩存,文件沒被修改而且不
超時(shí)(注釋1),就讀取緩存,返回結(jié)果,就是這個(gè)思路,看看這個(gè)源碼:
關(guān)鍵字:PHP、緩存、服務(wù)器、數(shù)據(jù)
- <?PHP
- class cache{
- private $cache_dir;
- private $expireTime=180;//緩存的時(shí)間是 60 秒
- function __construct($cache_dirname){
- if(!@is_dir($cache_dirname)){
- if(!@mkdir($cache_dirname,0777)){
- $this->warn('緩存文件不存在而且不能創(chuàng)建,需要手動(dòng)創(chuàng)建.');
- return false;
- }
- }
- $this->cache_dir = $cache_dirname;
- }
- function __destruct(){
- echo 'Cache class bye.';
- }
- function get_url() {
- if (!isset($_SERVER['REQUEST_URI'])) {
- $url = $_SERVER['REQUEST_URI'];
- }else{
- $url = $_SERVER['_NAME'];
- $url .= (!emptyempty($_SERVER['QUERY_STRING'])) ? '?' . $_SERVER['QUERY_STRING'] : '';
- }
- return $url;
- }
- function warn($errorstring){
- echo "<b><font color='red'>發(fā)生錯(cuò)誤:<pre>".$errorstring."</pre></font></b>";
- }
- function cache_page($pageurl,$pagedata){
- if(!$fso=fopen($pageurl,'w')){
- $this->warns('無法打開緩存文件.');//trigger_error
- return false;
- }
- if(!flock($fso,LOCK_EX)){//LOCK_NB,排它型鎖定
- $this->warns('無法鎖定緩存文件.');//trigger_error
- return false;
- }
- if(!fwrite($fso,$pagedata)){//寫入字節(jié)流,serialize寫入其他格式
- $this->warns('無法寫入緩存文件.');//trigger_error
- return false;
- }
- flock($fso,LOCK_UN);//釋放鎖定
- fclose($fso);
- return true;
- }
- function display_cache($cacheFile){
- if(!file_exists($cacheFile)){
- $this->warn('無法讀取緩存文件.');//trigger_error
- return false;
- }
- echo '讀取緩存文件:'.$cacheFile;
- //return unserialize(file_get_contents($cacheFile));
- $fso = fopen($cacheFile, 'r');
- $data = fread($fso, filesize($cacheFile));
- fclose($fso);
- return $data;
- }
- function readData($cacheFile='default_cache.txt'){
- $cacheFile = $this->cache_dir."/".$cacheFile;
- if(file_exists($cacheFile)&&filemtime($cacheFile)>(time()-$this->expireTime)){
- $data=$this->display_cache($cacheFile);
- }else{
- $data="from here wo can get it from mysql database,update time is <b>".date('l dS \of F Y h:i:s A')."</b>,過期時(shí)間是:".date('l dS \of F Y h:i:s A',time()+$this->expireTime)."----------";
- $this->cache_page($cacheFile,$data);
- }
- return $data;
- }
- }
?>
新文章:
- CentOS7下圖形配置網(wǎng)絡(luò)的方法
- CentOS 7如何添加刪除用戶
- 如何解決centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS單網(wǎng)卡如何批量添加不同IP段
- CentOS下iconv命令的介紹
- Centos7 SSH密鑰登陸及密碼密鑰雙重驗(yàn)證詳解
- CentOS 7.1添加刪除用戶的方法
- CentOS查找/掃描局域網(wǎng)打印機(jī)IP講解
- CentOS7使用hostapd實(shí)現(xiàn)無AP模式的詳解
- su命令不能切換root的解決方法
- 解決VMware下CentOS7網(wǎng)絡(luò)重啟出錯(cuò)
- 解決Centos7雙系統(tǒng)后丟失windows啟動(dòng)項(xiàng)
- CentOS下如何避免文件覆蓋
- CentOS7和CentOS6系統(tǒng)有什么不同呢
- Centos 6.6默認(rèn)iptable規(guī)則詳解