中文字幕二区_国产精品免费在线观看_黄色网站观看_人人草人人澡_日本真实娇小xxxx

您的位置: 首頁(yè) > 技術(shù)文檔 > 網(wǎng)絡(luò)編程 > 緩存技術(shù)詳談—php
談PHP生成靜態(tài)頁(yè)面 回到列表 目錄,文件操作詳談—php
 緩存技術(shù)詳談—php

作者:5do8 時(shí)間: 2006-03-22 文檔類型:原創(chuàng) 來(lái)自:藍(lán)色理想

一、引論

PHP,一門最近幾年興起的web設(shè)計(jì)腳本語(yǔ)言,由于它的強(qiáng)大和可伸縮性,近幾年來(lái)得到長(zhǎng)足的發(fā)展,php相比傳統(tǒng)的asp網(wǎng)站,在速度上有絕對(duì)的優(yōu)勢(shì),想mssql轉(zhuǎn)6萬(wàn)條數(shù)據(jù)php如需要40秒,asp不下2分鐘.但是,由于網(wǎng)站的數(shù)據(jù)越來(lái)越多,我們渴求能更快速的調(diào)用數(shù)據(jù),不必要每次都從數(shù)據(jù)庫(kù)掉,我們可以從其他的地方,比方一個(gè)文件,或者某個(gè)內(nèi)存地址,這就是php的緩存技術(shù),也就是Cache技術(shù).

二、分析深入

一般來(lái)說(shuō),緩存的目的是把數(shù)據(jù)放在一個(gè)地方讓訪問(wèn)的更快點(diǎn),毫無(wú)疑問(wèn),內(nèi)存是最快的,但是,幾百M(fèi)的數(shù)據(jù)能往內(nèi)存放么?這不現(xiàn)實(shí),當(dāng)然,有的時(shí)候臨時(shí)放如服務(wù)器緩存,如ob_start()這個(gè)緩存頁(yè)面開(kāi)啟的話在發(fā)送文件頭之前頁(yè)面內(nèi)容都被緩存在內(nèi)存中,知道等頁(yè)面輸出自動(dòng)清楚或者等待ob_get_contents的返回,或者被ob_end_clean顯示的清除,這在靜態(tài)頁(yè)面的生成中能很好的利用,在模板中能得到很好的體現(xiàn),我的這篇文章深入的討論了:談PHP生成靜態(tài)頁(yè)面,這是一種方式,但這是臨時(shí)性的,不是解決我們問(wèn)題的好方法.

另外,在asp中有一對(duì)象application,可以保存公用的參數(shù),這也算點(diǎn)緩存,但在php,我至今沒(méi)看到開(kāi)發(fā)者產(chǎn)出這種對(duì)象,的確,沒(méi)必要.asp.net的頁(yè)面緩存技術(shù)就用的是viewstate,而cache就是文件關(guān)聯(lián),(不一定準(zhǔn)確),文件被修改,更新緩存,文件沒(méi)被修改而且不超時(shí)(注釋1),就讀取緩存,返回結(jié)果,就是這個(gè)思路,看看這個(gè)源碼:

<?php
class cache{
/*
Class Name: cache
Description: control to cache data,$cache_out_time is a array to save cache date time out.
Version: 1.0
Author: 老農(nóng) cjjer
Last modify:2006-2-26
Author URL: http://www.cjjer.com
*/
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['SCRIPT_NAME'];
                $url .= (!empty($_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('無(wú)法打開(kāi)緩存文件.');//trigger_error
  return false;
 }
 if(!flock($fso,LOCK_EX)){//LOCK_NB,排它型鎖定
  $this->warns('無(wú)法鎖定緩存文件.');//trigger_error
  return false;
 }
 if(!fwrite($fso,$pagedata)){//寫入字節(jié)流,serialize寫入其他格式
  $this->warns('無(wú)法寫入緩存文件.');//trigger_error
  return false;
 }
 flock($fso,LOCK_UN);//釋放鎖定
 fclose($fso);
 return true;
}

function display_cache($cacheFile){
            if(!file_exists($cacheFile)){
    $this->warn('無(wú)法讀取緩存文件.');//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>,過(guò)期時(shí)間是:".date('l dS \of F Y h:i:s A',time()+$this->expireTime)."----------";
   $this->cache_page($cacheFile,$data);
 }
  return $data;
}

 

}
?>

下面我打斷這個(gè)代碼逐行解釋.

三、程序透析

這個(gè)緩存類(類沒(méi)什么好怕的.請(qǐng)繼續(xù)看)名稱是cache,有2個(gè)屬性:

private $cache_dir;
private $expireTime=180;

$cache_dir是緩存文件所放的相對(duì)網(wǎng)站目錄的父目錄, $expireTime(注釋一)是我們緩存的數(shù)據(jù)過(guò)期的時(shí)間,主要是這個(gè)思路:
當(dāng)數(shù)據(jù)或者文件被加載的時(shí)候,先判斷緩存文件存在不,返回false ,文件最后修改時(shí)間和緩存的時(shí)間和比當(dāng)前時(shí)間大不,大的話說(shuō)明緩存還沒(méi)到期,小的話返回false,當(dāng)返回false的時(shí)候,讀取原始數(shù)據(jù),寫入緩存文件中,返回?cái)?shù)據(jù).

接著看程序:

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;
}

當(dāng)類第一次被實(shí)例的時(shí)候構(gòu)造默認(rèn)函數(shù)帶參數(shù)緩存文件名稱,如文件不存在,創(chuàng)建一個(gè)有編輯權(quán)限的文件夾,創(chuàng)建失敗的時(shí)候拋出異常.然后把cache類的 $cache_dir屬性設(shè)置為這個(gè)文件夾名稱,我們的所有緩存文件都是在這個(gè)文件夾下面的.

function __destruct(){
 echo 'Cache class bye.';
}

這是class類的析構(gòu)函數(shù),為了演示,我們輸出一個(gè)字符串表示我們釋放cache類資源成功.

function warn($errorstring){
echo "<b><font color='red'>發(fā)生錯(cuò)誤:<pre>".$errorstring."</pre></font></b>";
}

這個(gè)方法輸出錯(cuò)誤信息.

function get_url() {
        if (!isset($_SERVER['REQUEST_URI'])) {
                $url = $_SERVER['REQUEST_URI'];
        }else{
                $url = $_SERVER['SCRIPT_NAME'];
                $url .= (!empty($_SERVER['QUERY_STRING'])) ? '?' . $_SERVER['QUERY_STRING'] : '';
        }

        return $url;
}

這個(gè)方法返回當(dāng)前url的信息,這是我看國(guó)外很多人的cms系統(tǒng)這樣做,主要是緩存x.php?page=1,x.php?page=2,等這種文件的,這里列出是為了擴(kuò)展的這個(gè)cache類功能的.

function cache_page($pageurl,$pagedata){
 if(!$fso=fopen($pageurl,'w')){
  $this->warns('無(wú)法打開(kāi)緩存文件.');//trigger_error
  return false;
 }
 if(!flock($fso,LOCK_EX)){//LOCK_NB,排它型鎖定
  $this->warns('無(wú)法鎖定緩存文件.');//trigger_error
  return false;
 }
 if(!fwrite($fso,$pagedata)){//寫入字節(jié)流,serialize寫入其他格式
  $this->warns('無(wú)法寫入緩存文件.');//trigger_error
  return false;
 }
 flock($fso,LOCK_UN);//釋放鎖定
 fclose($fso);
 return true;
}

cache_page方法分別傳入的是緩存的文件名稱和數(shù)據(jù),這是把數(shù)據(jù)寫到文件里的方法,先用fopen打開(kāi)文件,然后調(diào)用句柄鎖定這個(gè)文件,然后用fwrite寫入文件,最后釋放這個(gè)句柄,任何一步發(fā)生錯(cuò)誤將拋出錯(cuò)誤. 您可能看到這個(gè)注釋:

寫入字節(jié)流,serialize寫入其他格式

順便一提的是如果我們要把一個(gè)數(shù)組,(可以從MySQL數(shù)據(jù)庫(kù)里面select查詢除了的結(jié)果)用serialize函數(shù)寫入,用unserialize讀取到原來(lái)的類型.

function display_cache($cacheFile){
            if(!file_exists($cacheFile)){
    $this->warn('無(wú)法讀取緩存文件.');//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;
}

這是由文件名稱讀取緩存的方法,直接打開(kāi)文件,讀取全部,如果文件不存在的或者無(wú)法讀取的話返回false,當(dāng)然,你感到不人性的話,可以重新生成緩存.

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>,過(guò)期時(shí)間是:".date('l dS \of F Y h:i:s A',time()+$this->expireTime)."----------";
   $this->cache_page($cacheFile,$data);
 }
  return $data;
}

這個(gè)函數(shù)是我們調(diào)用的方法,可以寫成接口的方法,由傳入?yún)?shù)判斷文件存在不,文件最后修改時(shí)間+expireTime的時(shí)間是不是過(guò)了當(dāng)前時(shí)間(大于的話說(shuō)明沒(méi)有過(guò)期),如果文件不存在或者已經(jīng)過(guò)期,重新加載原始數(shù)據(jù),這里,為了簡(jiǎn)單期間,我們是直接源是字符串,您可以把cache類繼承某類,取到數(shù)據(jù)庫(kù)的數(shù)據(jù).(注釋2)

四、補(bǔ)充說(shuō)明,結(jié)語(yǔ)

注釋一:這個(gè)緩存的時(shí)間您可以自己調(diào),可以根據(jù)時(shí)間情況讀取數(shù)組,xml,緩存等,請(qǐng)按照您的方便,值得一提的是緩存的時(shí)間(也就是緩存的key)也用緩存控制,.這在cms系統(tǒng)中被廣泛使用,他們把要更新的key放在緩存中,非常容易控制全戰(zhàn).

注釋二:php5開(kāi)始支持類繼承,這是讓人興奮的,把網(wǎng)站全局休息寫在一個(gè)配置的類里面,再寫與數(shù)據(jù)層交互的類(如與MySQL交互的類),我們的這個(gè)cache類繼承數(shù)據(jù)交互的類,可以非常容易的讀取數(shù)據(jù)庫(kù),這是外話,此處不再展開(kāi),有時(shí)間和大家詳談.

特別說(shuō)明,這個(gè)類文件針對(duì)的php5以上版本,其他版本的請(qǐng)不要使用類.

相關(guān)推薦:目錄,文件操作詳談

出處:藍(lán)色理想
責(zé)任編輯:moby

◎進(jìn)入論壇網(wǎng)絡(luò)編程版塊參加討論

相關(guān)文章 更多相關(guān)鏈接
談PHP生成靜態(tài)頁(yè)面
目錄,文件操作詳談—php
用php讀取xml數(shù)據(jù)
玩轉(zhuǎn)圖像函數(shù)庫(kù)—常見(jiàn)圖形操作
[PHP]配置,使用Smarty技術(shù)
作者文章 更多作者文章
談PHP生成靜態(tài)頁(yè)面
目錄,文件操作詳談—php
模板用xml的思路
玩轉(zhuǎn)圖像函數(shù)庫(kù)—常見(jiàn)圖形操作
asp編譯成dll-圖形化教程
關(guān)鍵字搜索 常規(guī)搜索 推薦文檔
熱門搜索:CSS Fireworks 設(shè)計(jì)比賽 網(wǎng)頁(yè)制作 web標(biāo)準(zhǔn) 用戶體驗(yàn) UE photoshop Dreamweaver Studio8 Flash 手繪 CG
站點(diǎn)最新 站點(diǎn)最新列表
周大!熬•自然”設(shè)計(jì)大賽開(kāi)啟
國(guó)際體驗(yàn)設(shè)計(jì)大會(huì)7月將在京舉行
中國(guó)國(guó)防科技信息中心標(biāo)志征集
云計(jì)算如何讓安全問(wèn)題可控
云計(jì)算是多數(shù)企業(yè)唯一擁抱互聯(lián)網(wǎng)的機(jī)會(huì)
阿里行云
云手機(jī)年終巨獻(xiàn),送禮標(biāo)配299起
阿里巴巴CTO王堅(jiān)的"云和互聯(lián)網(wǎng)觀"
1499元買真八核 云OS雙蛋大促
首屆COCO桌面手機(jī)主題設(shè)計(jì)大賽
欄目最新 欄目最新列表
淺談JavaScript編程語(yǔ)言的編碼規(guī)范
如何在illustrator中繪制臺(tái)歷
Ps簡(jiǎn)單繪制一個(gè)可愛(ài)的鉛筆圖標(biāo)
數(shù)據(jù)同步算法研究
用ps作簡(jiǎn)單的作品展示頁(yè)面
CSS定位機(jī)制之一:普通流
25個(gè)最佳最閃亮的Eclipse開(kāi)發(fā)項(xiàng)目
Illustrator中制作針線縫制文字效果
Photoshop制作印刷凹凸字體
VS2010中創(chuàng)建自定義SQL Rule

藍(lán)色理想版權(quán)申明:除部分特別聲明不要轉(zhuǎn)載,或者授權(quán)我站獨(dú)家播發(fā)的文章外,大家可以自由轉(zhuǎn)載我站點(diǎn)的原創(chuàng)文章,但原作者和來(lái)自我站的鏈接必須保留(非我站原創(chuàng)的,按照原來(lái)自一節(jié),自行鏈接)。文章版權(quán)歸我站和作者共有。

轉(zhuǎn)載要求:轉(zhuǎn)載之圖片、文件,鏈接請(qǐng)不要盜鏈到本站,且不準(zhǔn)打上各自站點(diǎn)的水印,亦不能抹去我站點(diǎn)水印。

特別注意:本站所提供的攝影照片,插畫,設(shè)計(jì)作品,如需使用,請(qǐng)與原作者聯(lián)系,版權(quán)歸原作者所有,文章若有侵犯作者版權(quán),請(qǐng)與我們聯(lián)系,我們將立即刪除修改。

您的評(píng)論
用戶名:  口令:
說(shuō)明:輸入正確的用戶名和密碼才能參與評(píng)論。如果您不是本站會(huì)員,你可以注冊(cè) 為本站會(huì)員。
注意:文章中的鏈接、內(nèi)容等需要修改的錯(cuò)誤,請(qǐng)用報(bào)告錯(cuò)誤,以利文檔及時(shí)修改。
不評(píng)分 1 2 3 4 5
注意:請(qǐng)不要在評(píng)論中含與內(nèi)容無(wú)關(guān)的廣告鏈接,違者封ID
請(qǐng)您注意:
·不良評(píng)論請(qǐng)用報(bào)告管理員,以利管理員及時(shí)刪除。
·尊重網(wǎng)上道德,遵守中華人民共和國(guó)的各項(xiàng)有關(guān)法律法規(guī)
·承擔(dān)一切因您的行為而直接或間接導(dǎo)致的民事或刑事法律責(zé)任
·本站評(píng)論管理人員有權(quán)保留或刪除其管轄評(píng)論中的任意內(nèi)容
·您在本站發(fā)表的作品,本站有權(quán)在網(wǎng)站內(nèi)轉(zhuǎn)載或引用
·參與本評(píng)論即表明您已經(jīng)閱讀并接受上述條款
推薦文檔 | 打印文檔 | 評(píng)論文檔 | 報(bào)告錯(cuò)誤  
專業(yè)書推薦 更多內(nèi)容
網(wǎng)站可用性測(cè)試及優(yōu)化指南
《寫給大家看的色彩書1》
《跟我去香港》
眾妙之門—網(wǎng)站UI 設(shè)計(jì)之道
《Flex 4.0 RIA開(kāi)發(fā)寶典》
《贏在設(shè)計(jì)》
犀利開(kāi)發(fā)—jQuery內(nèi)核詳解與實(shí)踐
作品集 更多內(nèi)容

雜⑦雜⑧ Gold NORMANA V2