缓存技术是每次访问页面的时候,都会先检测相应的缓存是否存在,如果不存在,就连接数据库,得到数据,完成模板变量的赋值,显示页面,同时生成缓存文件,这样下次访问的时候缓存文件就发挥作用了.
而不会再执行if块的数据查询语句了,当然,在实际使用中会有很多东西要考虑,比如,有效期的设置,缓存组的设置等等.
php实现文件数据缓存实现代码如下:
-
<?php
-
class cacheexception extends exception {}
-
-
-
-
abstract class cache_abstract {
-
-
-
-
-
-
-
abstract public function fetch($key);
-
-
-
-
-
-
-
-
-
abstract public function store($key, $value);
-
-
-
-
-
-
-
-
abstract public function delete($key);
-
-
-
-
-
-
-
abstract public function clear();
-
-
-
-
-
-
-
-
abstract public function lock($key);
-
-
-
-
-
-
-
-
abstract public function unlock($key);
-
-
-
-
-
-
-
-
abstract public function islocked($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;
-
}
-
}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
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');
-
}
-
}
-
-
-
-
-
-
-
-
-
public function store($key, $value) {
-
return apc_store($this->_storagekey($key), $value);
-
}
-
-
-
-
-
-
-
-
public function fetch($key) {
-
return apc_fetch($this->_storagekey($key));
-
}
-
-
-
-
-
-
-
public function clear() {
-
apc_clear_cache();
-
return $this;
-
}
-
-
-
-
-
-
-
public function delete($key) {
-
apc_delete($this->_storagekey($key));
-
return $this;
-
}
-
-
-
-
-
-
-
-
public function islocked($key) {
-
if ((apc_fetch($this->_storagekey($key) . '.lock')) === false) {
-
return false;
-
}
-
-
return true;
-
}
-
-
-
-
-
-
-
-
public function lock($key) {
-
apc_store($this->_storagekey($key) . '.lock', '', 5);
-
return $this;
-
}
-
-
-
-
-
-
-
-
public function unlock($key) {
-
apc_delete($this->_storagekey($key) . '.lock');
-
return $this;
-
}
-
-
-
-
-
-
-
-
private function _storagekey($key) {
-
return $this->_prefix . '_' . $key;
-
}
-
}
-
-
-
-
-
-
-
-
-
-
-
-
-
class cache_file extends cache_abstract {
-
public $usesubdir = false;
-
-
protected $_cachesdir = 'cache';
-
-
public function __construct() {
-
if (defined('data_dir')) {
-
$this->_setcachedir(data_dir . '/cache');
-
}
-
}
-
-
-
-
-
-
-
-
protected function _getcachefile($key) {
-
$subdir = $this->usesubdir ? substr($key, 0, 2) . '/' : '';
-
return $this->_cachesdir . '/' . $subdir . $key . '.php';
-
}
-
-
-
-
-
-
-
-
-
public function fetch($key) {
-
$cachefile = self::_getcachefile($key);
-
if (file_exists($cachefile) && is_readable($cachefile)) {
-
-
-
-
-
return unserialize(@file_get_contents($cachefile, false, null, 13));
-
}
-
-
return false;
-
}
-
-
-
-
-
-
-
-
-
-
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");
-
}
-
}
-
-
-
-
return @file_put_contents($cachefile, '<?php exit;?>' . serialize($value));
-
}
-
-
-
-
-
-
-
-
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;
-
}
-
-
-
-
-
-
-
-
public function islocked($key) {
-
$cachefile = self::_getcachefile($key);
-
clearstatcache();
-
return file_exists($cachefile . '.lock');
-
}
-
-
-
-
-
-
-
-
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;
-
}
-
-
-
-
-
-
-
-
public function unlock($key) {
-
-
$cachefile = self::_getcachefile($key);
-
@unlink($cachefile . '.lock');
-
return
-
?>
下面来看一款关于smarty缓存的文件实例代码,再来看看smarty提供的页面缓存功能:
-
<?php
-
-
require('smarty.class.php');
-
-
$smarty = new smarty;
-
-
$smarty->caching = true;
-
-
if(!$smarty->is_cached('index.tpl')) {
-
-
-
-
$contents = get_database_contents();
-
-
$smarty->assign($contents);
-
-
}
-
-
$smarty->display('index.tpl');
-
-
?>
php缓存技术工作时,当程序查询数据的时候,会把相应的结果序列化后保存到文件中,以后同样的查询语句就可以不用直接查询数据库,而是从缓存文件中获得,这一改进使得程序运行速度得以太幅度提升.
(责任编辑:最模板) |