php實現檔案資料緩衝實現代碼

來源:互聯網
上載者:User

而不會再執行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緩衝技術工作時,當程式查詢資料的時候,會把相應的結果序列化後儲存到檔案中,以後同樣的查詢語句就可以不用直接查詢資料庫,而是從快取檔案中獲得。這一改進使得程式運行速度得以太幅度提升.

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.