程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php實現文件數據緩存實現代碼

php實現文件數據緩存實現代碼

編輯:關於PHP編程

php實現文件數據緩存實現代碼緩存技術是每次訪問頁面的時候,都會先檢測相應的緩存是否存在,如果不存在,就連接數據庫,得到數據,完成模板變量的賦值,顯示頁面,同時生成緩存文件,這樣下次訪問的時候緩存文件就發揮作用了

php教程實現文件數據緩存實現代碼
緩存技術是每次訪問頁面的時候,都會先檢測相應的緩存是否存在,如果不存在,就連接數據庫教程,得到數據,完成模板變量的賦值,顯示頁面,同時生成緩存文件,這樣下次訪問的時候緩存文件就發揮作用了,而不會再執行if塊的數據查詢語句了。當然,在實際使用中會有很多東西要考慮,比如,有效期的設置,緩存組的設置等等

<?php 
class cacheexception extends exception {} 
/**
 * 緩存抽象類
 */ 
abstract class cache_abstract { 
    /**
     * 讀緩存變量
     *
     * @param string $key 緩存下標
     * @return mixed
     */ 
    abstract public function fetch($key); 
     
    /**
     * 緩存變量
     *
     * @param string $key 緩存變量下標
     * @param string $value 緩存變量的值
     * @return bool
     */ 
    abstract public function store($key, $value); 
     
    /**
     * 刪除緩存變量
     *
     * @param string $key 緩存下標
     * @return cache_abstract
     */ 
    abstract public function delete($key); 
     
    /**
     * 清(刪)除所有緩存
     *
     * @return cache_abstract
     */ 
    abstract public function clear(); 
     
    /**
     * 鎖定緩存變量
     *
     * @param string $key 緩存下標
     * @return cache_abstract
     */ 
    abstract public function lock($key); 
 
    /**
     * 緩存變量解鎖
     *
     * @param string $key 緩存下標
     * @return cache_abstract
     */ 
    abstract public function unlock($key); 
 
    /**
     * 取得緩存變量是否被鎖定
     *
     * @param string $key 緩存下標
     * @return bool
     */ 
    abstract public function islocked($key); 
 
    /**
     * 確保不是鎖定狀態
     * 最多做$tries次睡眠等待解鎖,超時則跳過並解鎖
     *
     * @param string $key 緩存下標
     */ 
    public function checklock($key) { 
        if (!$this->islocked($key)) { 
            return $this; 
        } 
         
        $tries = 10; 
        $count = 0; 
        do { 
            usleep(200); 
            $count ++; 
        } while ($count <= $tries && $this->islocked($key));  // 最多做十次睡眠等待解鎖,超時則跳過並解鎖 
 
        $this->islocked($key) && $this->unlock($key); 
         
        return $this; 
    } 

 
 
/**
 * apc擴展緩存實現
 * 
 * 
 * @category   mjie
 * @package    cache
 * @author     流水孟春
 * @copyright  copyright (c) 2008- <cmpan(at)qq.com>
 * @license    new bsd license
 * @version    $id: cache/apc.php 版本號 2010-04-18 23:02 cmpan $
 */ 
class cache_apc extends cache_abstract { 
     
    protected $_prefix = 'cache.mjie.net'; 
     
    public function __construct() { 
        if (!function_exists('apc_cache_info')) { 
            throw new cacheexception('apc extension didn't installed'); 
        } 
    } 
     
    /**
     * 保存緩存變量
     *
     * @param string $key
     * @param mixed $value
     * @return bool
     */ 
    public function store($key, $value) { 
        return apc_store($this->_storagekey($key), $value); 
    } 
     
    /**
     * 讀取緩存
     *
     * @param string $key
     * @return mixed
     */ 
    public function fetch($key) { 
        return apc_fetch($this->_storagekey($key)); 
    } 
     
    /**
     * 清除緩存
     *
     * @return cache_apc
     */ 
    public function clear() { 
        apc_clear_cache(); 
        return $this; 
    } 
     
    /**
     * 刪除緩存單元
     *
     * @return cache_apc
     */ 
    public function delete($key) { 
        apc_delete($this->_storagekey($key)); 
        return $this; 
    } 
     
    /**
     * 緩存單元是否被鎖定
     *
     * @param string $key
     * @return bool
     */ 
    public function islocked($key) { 
        if ((apc_fetch($this->_storagekey($key) . '.lock')) === false) { 
            return false; 
        } 
         
        return true; 
    } 
     
    /**
     * 鎖定緩存單元
     *
     * @param string $key
     * @return cache_apc
     */ 
    public function lock($key) { 
        apc_store($this->_storagekey($key) . '.lock', '', 5); 
        return $this; 
    } 
     
    /**
     * 緩存單元解鎖
     *
     * @param string $key
     * @return cache_apc
     */ 
    public function unlock($key) { 
        apc_delete($this->_storagekey($key) . '.lock'); 
        return $this; 
    } 
     
    /**
     * 完整緩存名
     *
     * @param string $key
     * @return string
     */ 
    private function _storagekey($key) { 
        return $this->_prefix . '_' . $key; 
    } 

 
/**
 * 文件緩存實現
 * 
 * 
 * @category   mjie
 * @package    cache
 * @author     流水孟春
 * @copyright  copyright (c) 2008- <cmpan(at)qq.com>
 * @license    new bsd license
 * @version    $id: cache/file.php 版本號 2010-04-18 16:46 cmpan $
 */ 
class cache_file extends cache_abstract { 
    public $usesubdir     = false; 
     
    protected $_cachesdir = 'cache'; 
     
    public function __construct() { 
        if (defined('data_dir')) { 
            $this->_setcachedir(data_dir . '/cache'); 
        } 
    } 
     
    /**
     * 獲取緩存文件
     *
     * @param string $key
     * @return string
     */ 
    protected function _getcachefile($key) { 
        $subdir = $this->usesubdir ? substr($key, 0, 2) . '/' : ''; 
        return $this->_cachesdir . '/' . $subdir . $key . '.php'; 
    } 
 
    /**
     * 讀取緩存變量
     * 為防止信息洩露,緩存文件格式為php文件,並以"<?php exit;?>"開頭
     * 
     * @param string $key 緩存下標
     * @return mixed
     */ 
    public function fetch($key) { 
        $cachefile = self::_getcachefile($key); 
        if (file_exists($cachefile) && is_readable($cachefile)) { 
            // include 方式 
            //return include $cachefile; 
            // 系列化方式 
 
            return unserialize(@file_get_contents($cachefile, false, null, 13)); 
        } 
 
        return false; 
    } 
 
    /**
     * 緩存變量
     * 為防止信息洩露,緩存文件格式為php文件,並以"<?php exit;?>"開頭
     *
     * @param string $key 緩存變量下標
     * @param string $value 緩存變量的值
     * @return bool
     */ 
    public function store($key, $value) { 
        $cachefile = self::_getcachefile($key); 
        $cachedir  = dirname($cachefile); 
 
        if(!is_dir($cachedir)) { 
            if(!@mkdir($cachedir, 0755, true)) { 
                throw new cacheexception("could not make cache directory"); 
            } 
        } 
    // 用include方式 
        //return @file_put_contents($cachefile, '<?php return ' . var_export($value, true). ';'); 
 
        return @file_put_contents($cachefile, '<?php exit;?>' . serialize($value)); 
    } 
 
    /**
     * 刪除緩存變量
     *
     * @param string $key 緩存下標
     * @return cache_file
     */ 
    public function delete($key) { 
        if(emptyempty($key)) { 
            throw new cacheexception("missing argument 1 for cache_file::delete()"); 
        } 
         
        $cachefile = self::_getcachefile($key); 
        if(!@unlink($cachefile)) { 
            throw new cacheexception("cache file could not be deleted"); 
        } 
 
        return $this; 
    } 
 
    /**
     * 緩存單元是否已經鎖定
     *
     * @param string $key
     * @return bool
     */ 
    public function islocked($key) { 
        $cachefile = self::_getcachefile($key); 
        clearstatcache(); 
        return file_exists($cachefile . '.lock'); 
    } 
 
    /**
     * 鎖定
     *
     * @param string $key
     * @return cache_file
     */ 
    public function lock($key) { 
        $cachefile = self::_getcachefile($key); 
        $cachedir  = dirname($cachefile); 
        if(!is_dir($cachedir)) { 
            if(!@mkdir($cachedir, 0755, true)) { 
                if(!is_dir($cachedir)) { 
                    throw new cacheexception("could not make cache directory"); 
                } 
            } 
        } 
 
        // 設定緩存鎖文件的訪問和修改時間 
        @touch($cachefile . '.lock'); 
        return $this; 
    } 
   
    /**
     * 解鎖
     *
     * @param string $key
     * @return cache_file
     */ 
    public function unlock($key) { 
        $cachefile = self::_getcachefile($key); 
        @unlink($cachefile . '.lock'); 
        return 

下面來看一款關於smarty緩存的文件實例代碼

再來看看smarty提供的頁面緩存功能:

 

 1<?php

  2require('smarty.class.php');

  3$smarty = new smarty;

  4$smarty->caching = true;

  5if(!$smarty->is_cached('index.tpl')) {

  6 // no cache available, do variable assignments here.

  7 $contents = get_database_contents();

  8 $smarty->assign($contents);

  9}

  10$smarty->display('index.tpl');

  11?>

php緩存技術工作時,當程序查詢數據的時候,會把相應的結果序列化後保存到文件中,以後同樣的查詢語句就可以不用直接查詢數據庫,而是從緩存文件中獲得。這一改進使得程序運行速度得以太幅度提升.

 


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved