最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

緩存技術詳談—php

 更新時間:2006年12月14日 00:00:00   作者:  
一、引論

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

二、分析深入

一般來說,緩存的目的是把數據放在一個地方讓訪問的更快點,毫 無疑問,內存是最快的,但是,幾百M的數據能往內存放么?這不現實,當然,有的時候臨時放如服務器緩存,如ob_start()這個緩存頁面開啟的話在發(fā) 送文件頭之前頁面內容都被緩存在內存中,知道等頁面輸出自動清楚或者等待ob_get_contents的返回,或者被ob_end_clean顯示的清 除,這在靜態(tài)頁面的生成中能很好的利用,在模板中能得到很好的體現,這是一種方式,但這是臨時性的,不是解決我們問題的好方法.

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


PHP:[Copy to clipboard]
<?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: 老農 cjjer
Last modify:2006-2-26
Author URL: http://www.cjjer.com
*/
private $cache_dir;
private $expireTime=180;//緩存的時間是 60 秒
function __construct($cache_dirname){
 if(!@is_dir($cache_dirname)){
  if(!@mkdir($cache_dirname,0777)){
  $this->warn('緩存文件不存在而且不能創(chuà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ā)生錯誤:<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>,過期時間是:".date('l dS of F Y h:i:s A',time()+$this->expireTime)."----------";
   $this->cache_page($cacheFile,$data);
 }
  return $data;
}


}
?> 


下面我打斷這個代碼逐行解釋.

三、程序透析

這個緩存類(類沒什么好怕的.請繼續(xù)看)名稱是cache,有2個屬性:


CODE:[Copy to clipboard]private $cache_dir;
private $expireTime=180;
$cache_dir是緩存文件所放的相對網站目錄的父目錄, $expireTime(注釋一)是我們緩存的數據過期的時間,主要是這個思路:
當數據或者文件被加載的時候,先判斷緩存文件存在不,返回false ,文件最后修改時間和緩存的時間和比當前時間大不,大的話說明緩存還沒到期,小的話返回false,當返回false的時候,讀取原始數據,寫入緩存文件中,返回數據.

接著看程序:


PHP:[Copy to clipboard]
function __construct($cache_dirname){
 if(!@is_dir($cache_dirname)){
  if(!@mkdir($cache_dirname,0777)){
  $this->warn('緩存文件不存在而且不能創(chuàng)建,需要手動創(chuàng)建.');
  return false;
  }
 }
$this->cache_dir = $cache_dirname;




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


PHP:[Copy to clipboard]
function __destruct(){
 echo 'Cache class bye.';




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


PHP:[Copy to clipboard]
function warn($errorstring){
echo "<b><font color='red'>發(fā)生錯誤:<pre>".$errorstring."</pre></font></b>";




這個方法輸出錯誤信息.


PHP:[Copy to clipboard]
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;




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


PHP:[Copy to clipboard]
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;




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

寫入字節(jié)流,serialize寫入其他格式
順便一提的是如果我們要把一個數組,(可以從MySQL數據庫里面select查詢除了的結果)用serialize函數寫入,用unserialize讀取到原來的類型.


PHP:[Copy to clipboard]
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;




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


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




這 個函數是我們調用的方法,可以寫成接口的方法,由傳入參數判斷文件存在不,文件最后修改時間+expireTime的時間是不是過了當前時間(大于的話說 明沒有過期),如果文件不存在或者已經過期,重新加載原始數據,這里,為了簡單期間,我們是直接源是字符串,您可以把cache類繼承某類,取到數據庫的 數據.(注釋2)

四、補充說明,結語 

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

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

特別說明,這個類文件針對的php5以上版本,其他版本的請不要使用類. 

相關文章

  • php簡單判斷兩個字符串是否相等的方法

    php簡單判斷兩個字符串是否相等的方法

    這篇文章主要介紹了php簡單判斷兩個字符串是否相等的方法,涉及php針對字符串操作的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • php提高網站效率的技巧

    php提高網站效率的技巧

    隨著國內PHP開發(fā)的興起,代碼優(yōu)化成了老生常談的話題了。作者本人時不時也會跑到CSDN壇論與人交流交流有交PHP開發(fā)和優(yōu)化問題,這也是可以使自身快速提高的方法。
    2015-09-09
  • 淺談ThinkPHP5.0版本和ThinkPHP3.2版本的區(qū)別

    淺談ThinkPHP5.0版本和ThinkPHP3.2版本的區(qū)別

    小編小編就為大家?guī)硪黄獪\談ThinkPHP5.0版本和ThinkPHP3.2版本的區(qū)別。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • php 刪除無限級目錄與文件代碼共享

    php 刪除無限級目錄與文件代碼共享

    php下需要刪除多級目錄的朋友及可以參考下面的類
    2008-11-11
  • PHP獲取當前相對于域名目錄的方法

    PHP獲取當前相對于域名目錄的方法

    這篇文章主要介紹了PHP獲取當前相對于域名目錄的方法,可實現從URL中拆分出目錄名的功能,需要的朋友可以參考下
    2015-06-06
  • thinkphp(php)插件鉤子(hooks)分析的簡單實現機制

    thinkphp(php)插件鉤子(hooks)分析的簡單實現機制

    現在主流的cms或者blog等系統(tǒng)中,都內置的有插件系統(tǒng),但是層層深入、剖析實現的方式,其實都是最簡單的鉤子的復雜化的實現。這篇文章主要介紹了thinkphp(php)插件鉤子(hooks)分析的簡單實現機制,需要的朋友可以參考下
    2023-03-03
  • php生成網頁桌面快捷方式

    php生成網頁桌面快捷方式

    本文將介紹使用PHP生成網頁桌面快捷方式的代碼,并添加圖標及解決不同瀏覽器保存出現的亂碼問題。下面跟著小編一起來看下吧
    2017-05-05
  • JoshChen_web格式編碼UTF8-無BOM的小細節(jié)分析

    JoshChen_web格式編碼UTF8-無BOM的小細節(jié)分析

    下面這張圖是用chrome瀏覽器打開一個2012年-2013學年第二學期的PHP課程的期末作業(yè),用的是PHP + smarty + mysql來實現的
    2013-08-08
  • 淺談COOKIE和SESSION區(qū)別

    淺談COOKIE和SESSION區(qū)別

    在PHP面試中經常碰到請闡述session與cookie的區(qū)別與聯(lián)系,以及如何修改兩者的有效時間。具體來說cookie機制采用的是在客戶端保持狀態(tài)的方案,而session機制采用的是在服務器端保持狀態(tài)的方案。
    2015-07-07
  • PHP學習筆記(二) 了解PHP的基本語法以及目錄結構

    PHP學習筆記(二) 了解PHP的基本語法以及目錄結構

    這篇文章主要介紹了解PHP的基本語法以及目錄結構,需要的朋友可以參考下
    2014-08-08

最新評論

枞阳县| 光山县| 新沂市| 承德市| 麻江县| 枣强县| 文成县| 云梦县| 平乡县| 江源县| 庄河市| 新干县| 胶南市| 鹿邑县| 莱州市| 盘山县| 宁都县| 德州市| 广饶县| 隆尧县| 凤庆县| 贵南县| 西青区| 田东县| 剑阁县| 惠水县| 赣州市| 法库县| 昌平区| 邵阳市| 博罗县| 庆元县| 资中县| 绥德县| 阿拉善盟| 循化| 安宁市| 平遥县| 磐安县| 武宁县| 雷州市|