您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關(guān)php如何實現(xiàn)文件緩存的內(nèi)容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
具體內(nèi)容如下
<?php class cache { private static $_instance = null; protected $_options = array( 'cache_dir' => "./", 'file_name_prefix' => 'cache', 'mode' => '1', //mode 1 為serialize model 2為保存為可執(zhí)行文件 ); /** * 得到本類實例 * * @return Ambiguous */ public static function getInstance() { if(self::$_instance === null) { self::$_instance = new self(); } return self::$_instance; } /** * 得到緩存信息 * * @param string $id * @return boolean|array */ public static function get($id) { $instance = self::getInstance(); //緩存文件不存在 if(!$instance->has($id)) { return false; } $file = $instance->_file($id); $data = $instance->_fileGetContents($file); if($data['expire'] == 0 || time() < $data['expire']) { return $data['contents']; } return false; } /** * 設(shè)置一個緩存 * * @param string $id 緩存id * @param array $data 緩存內(nèi)容 * @param int $cacheLife 緩存生命 默認(rèn)為0無限生命 */ public static function set($id, $data, $cacheLife = 0) { $instance = self::getInstance(); $time = time(); $cache = array(); $cache['contents'] = $data; $cache['expire'] = $cacheLife === 0 ? 0 : $time + $cacheLife; $cache['mtime'] = $time; $file = $instance->_file($id); return $instance->_filePutContents($file, $cache); } /** * 清除一條緩存 * * @param string cache id * @return void */ public static function delete($id) { $instance = self::getInstance(); if(!$instance->has($id)) { return false; } $file = $instance->_file($id); //刪除該緩存 return unlink($file); } /** * 判斷緩存是否存在 * * @param string $id cache_id * @return boolean true 緩存存在 false 緩存不存在 */ public static function has($id) { $instance = self::getInstance(); $file = $instance->_file($id); if(!is_file($file)) { return false; } return true; } /** * 通過緩存id得到緩存信息路徑 * @param string $id * @return string 緩存文件路徑 */ protected function _file($id) { $instance = self::getInstance(); $fileNmae = $instance->_idToFileName($id); return $instance->_options['cache_dir'] . $fileNmae; } /** * 通過id得到緩存信息存儲文件名 * * @param $id * @return string 緩存文件名 */ protected function _idToFileName($id) { $instance = self::getInstance(); $prefix = $instance->_options['file_name_prefix']; return $prefix . '---' . $id; } /** * 通過filename得到緩存id * * @param $id * @return string 緩存id */ protected function _fileNameToId($fileName) { $instance = self::getInstance(); $prefix = $instance->_options['file_name_prefix']; return preg_replace('/^' . $prefix . '---(.*)$/', '$1', $fileName); } /** * 把數(shù)據(jù)寫入文件 * * @param string $file 文件名稱 * @param array $contents 數(shù)據(jù)內(nèi)容 * @return bool */ protected function _filePutContents($file, $contents) { if($this->_options['mode'] == 1) { $contents = serialize($contents); } else { $time = time(); $contents = "<?php\n". " // mktime: ". $time. "\n". " return ". var_export($contents, true). "\n?>"; } $result = false; $f = @fopen($file, 'w'); if ($f) { @flock($f, LOCK_EX); fseek($f, 0); ftruncate($f, 0); $tmp = @fwrite($f, $contents); if (!($tmp === false)) { $result = true; } @fclose($f); } @chmod($file,0777); return $result; } /** * 從文件得到數(shù)據(jù) * * @param sring $file * @return boolean|array */ protected function _fileGetContents($file) { if(!is_file($file)) { return false; } if($this->_options['mode'] == 1) { $f = @fopen($file, 'r'); @$data = fread($f,filesize($file)); @fclose($f); return unserialize($data); } else { return include $file; } } /** * 構(gòu)造函數(shù) */ protected function __construct() { } /** * 設(shè)置緩存路徑 * * @param string $path * @return self */ public static function setCacheDir($path) { $instance = self::getInstance(); if (!is_dir($path)) { exit('file_cache: ' . $path.' 不是一個有效路徑 '); } if (!is_writable($path)) { exit('file_cache: 路徑 "'.$path.'" 不可寫'); } $path = rtrim($path,'/') . '/'; $instance->_options['cache_dir'] = $path; return $instance; } /** * 設(shè)置緩存文件前綴 * * @param srting $prefix * @return self */ public static function setCachePrefix($prefix) { $instance = self::getInstance(); $instance->_options['file_name_prefix'] = $prefix; return $instance; } /** * 設(shè)置緩存存儲類型 * * @param int $mode * @return self */ public static function setCacheMode($mode = 1) { $instance = self::getInstance(); if($mode == 1) { $instance->_options['mode'] = 1; } else { $instance->_options['mode'] = 2; } return $instance; } /** * 刪除所有緩存 * @return boolean */ public static function flush() { $instance = self::getInstance(); $glob = @glob($instance->_options['cache_dir'] . $instance->_options['file_name_prefix'] . '--*'); if(empty($glob)) { return false; } foreach ($glob as $v) { $fileName = basename($v); $id = $instance->_fileNameToId($fileName); $instance->delete($id); } return true; } } /* 初始化設(shè)置cache的配置信息什么的 */ cache::setCachePrefix('core'); //設(shè)置緩存文件前綴 cache::setCacheDir('./cache'); //設(shè)置存放緩存文件夾路徑 //模式1 緩存存儲方式 //a:3:{s:8:"contents";a:7:{i:0;i:1;i:1;i:2;i:2;i:3;i:3;i:34;i:4;i:5;i:5;i:6;i:6;i:6;}s:6:"expire";i:0;s:5:"mtime";i:1318218422;} //模式2 緩存存儲方式 /* <?php // mktime: 1318224645 return array ( 'contents' => array ( 0 => 1, 1 => 2, 2 => 3, 3 => 34, 4 => 5, 5 => 6, 6 => 6, ), 'expire' => 0, 'mtime' => 1318224645, ) ?> * * */ cache::setCacheMode('2'); if(!$row = cache::get('zj2')) { $array = array(1,2,3,34,5,6,6); $row = cache::set('zj2',$array); } // cache::flush(); 清空所有緩存 print_r($row);
文件緩存class
<?php /** * 文件緩存類 * @author xiaojiong & 290747680@qq.com * @date 2011-08-17 */ class cache { const FILE_LIFE_KEY = 'FILE_LIFE_KEY'; const CLEAR_ALL_KEY = 'CLEAR_ALL'; static $_instance = null; protected $_options = array( 'cache_dir' => './cache', 'file_locking' => true, 'file_name_prefix' => 'cache', 'cache_file_umask' => 0777, 'file_life' => 100000 ); static function &getInstance($options = array()) { if(self::$_instance === null) { self::$_instance = new self($options); } return self::$_instance; } /** * 設(shè)置參數(shù) * @param array $options 緩存參數(shù) * @return void */ static function &setOptions($options = array()) { return self::getInstance($options); } /** * 構(gòu)造函數(shù) * @param array $options 緩存參數(shù) * @return void */ private function __construct($options = array()) { if ($this->_options['cache_dir'] !== null) { $dir = rtrim($this->_options['cache_dir'],'/') . '/'; $this->_options['cache_dir'] = $dir; if (!is_dir($this->_options['cache_dir'])) { mkdir($this->_options['cache_dir'],0777,TRUE); } if (!is_writable($this->_options['cache_dir'])) { exit('file_cache: 路徑 "'. $this->_options['cache_dir'] .'" 不可寫'); } } else { exit('file_cache: "options" cache_dir 不能為空 '); } } /** * 設(shè)置緩存路徑 * @param string $value * @return void */ static function setCacheDir($value) { $self = & self::getInstance(); if (!is_dir($value)) { exit('file_cache: ' . $value.' 不是一個有效路徑 '); } if (!is_writable($value)) { exit('file_cache: 路徑 "'.$value.'" 不可寫'); } $value = rtrim($this->_options['cache_dir'],'/') . '/'; $self->_options['cache_dir'] = $value; } /** * 存入緩存數(shù)據(jù) * @param array $data 放入緩存的數(shù)據(jù) * @param string $id 緩存id(又名緩存識別碼) * @param cache_life 緩存時間 * @return boolean True if no problem */ static function save($data, $id = null, $cache_life = null) { $self = & self::getInstance(); if (!$id) { if ($self->_id) { $id = $self->_id; } else { exit('file_cache:save() id 不能為空!'); } } $time = time(); if($cache_life) { $data[self::FILE_LIFE_KEY] = $time + $cache_life; } elseif ($cache_life != 0){ $data[self::FILE_LIFE_KEY] = $time + $self->_options['file_life']; } $file = $self->_file($id); $data = "<?php\n". " // mktime: ". $time. "\n". " return ". var_export($data, true). "\n?>" ; $res = $self->_filePutContents($file, $data); return $res; } /** * 得到緩存信息 * * @param string $id 緩存id * @return string|array 緩存數(shù)據(jù) */ static function load($id) { $self = & self::getInstance(); $time = time(); //檢測緩存是否存在 if (!$self->test($id)) { // The cache is not hit ! return false; } //全部清空識別文件 $clearFile = $self->_file(self::CLEAR_ALL_KEY); $file = $self->_file($id); //判斷緩存是否已被全部清除 if(is_file($clearFile) && filemtime($clearFile) > filemtime($file)) { return false; } $data = $self->_fileGetContents($file); if(empty($data[self::FILE_LIFE_KEY]) || $time < $data[self::FILE_LIFE_KEY]) { unset($data[self::FILE_LIFE_KEY]); return $data; } return false; } /** * 寫入緩存文件 * * @param string $file 緩存路徑 * @param string $string 緩存信息 * @return boolean true 成功 */ protected function _filePutContents($file, $string) { $self = & self::getInstance(); $result = false; $f = @fopen($file, 'ab+'); if ($f) { if ($self->_options['file_locking']) @flock($f, LOCK_EX); fseek($f, 0); ftruncate($f, 0); $tmp = @fwrite($f, $string); if (!($tmp === false)) { $result = true; } @fclose($f); } @chmod($file, $self->_options['cache_file_umask']); return $result; } /** * 格式化后的緩存文件路徑 * * @param string $id 緩存id * @return string 緩存文件名(包括路徑) */ protected function _file($id) { $self = & self::getInstance(); $fileName = $self->_idToFileName($id); return $self->_options['cache_dir'] . $fileName; } /** * 格式化后的緩存文件名字 * * @param string $id 緩存id * @return string 緩存文件名 */ protected function _idToFileName($id) { $self = & self::getInstance(); $self->_id = $id; $prefix = $self->_options['file_name_prefix']; $result = $prefix . '---' . $id; return $result; } /** * 判斷緩存是否存在 * * @param string $id Cache id * @return boolean True 緩存存在 False 緩存不存在 */ static function test($id) { $self = & self::getInstance(); $file = $self->_file($id); if (!is_file($file)) { return false; } return true; } /** * 得到緩存信息 * * @param string $file 緩存路徑 * @return string 緩存內(nèi)容 */ protected function _fileGetContents($file) { if (!is_file($file)) { return false; } return include $file; } /** * 清除所有緩存 * * @return void */ static function clear() { $self = & self::getInstance(); $self->save('CLEAR_ALL',self::CLEAR_ALL_KEY); } /** * 清除一條緩存 * * @param string cache id * @return void */ static function del($id) { $self = & self::getInstance(); if(!$self->test($id)){ // 該緩存不存在 return false; } $file = $self->_file($id); return unlink($file); } }
存入數(shù)據(jù)
<?php $config = array( 'name' => 'xiaojiong', 'qq' => '290747680', 'age' => '20', ); //第一個參數(shù) 緩存data //第二個參數(shù) 緩存id //第三個參數(shù) cache_life 0 永不過期(cache::clear()清空所有除外) 默認(rèn)cache_life 為option_cache_life cache::save($config,'config',0);
載入數(shù)據(jù)
<?php //只有一個參數(shù) cache_id $config = cache::load('config');
清空緩存
<?php //清空指定緩存 cache::del('config'); //清空所有緩存 cache::clear();
cache信息配置
//在執(zhí)行所有cache_func前調(diào)用 $_options = array( 'cache_dir' => './cache', //緩存文件目錄 'file_name_prefix' => 'cache',//緩存文件前綴 'file_life' => 100000, //緩存文件生命 ); cache::setOptions($options); //再執(zhí)行 就會按著新配置信息執(zhí)行,否則是默認(rèn)信息 cache::save($arr,'arr'); //就是這個方法 貌似不合理 望大家指點
感謝各位的閱讀!關(guān)于“php如何實現(xiàn)文件緩存”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。