针对于部分频繁请求,又不需要频繁更改的数据,可以考虑以缓存的形式读取。适当时机再做更新。
以文件缓存为例。
PHP缓存类实例化使用
$cache_class = \Library\Cache::getInstance();
自动加载操作 CLASS_PATH 为类存放目录(后面带目录斜杠)
// 截取系统自动导入类
spl_autoload_register(function ($class) {
if (strpos($class, '\\') !== false) {
//带命名空间的外部类
$class = str_replace("\\", "/", $class);
$file = CLASS_PATH . $class . '.php';
require $file;
return true;
}
}, true, true);
缓存类操作
$cache_class->remove('key');
$cache_class->removeAll();
$cache_class->set('key',$data);
$cache_class->get('key');
缓存类定义
<?php
namespace Library;
class Cache {
// 类实例
private static $instance = null;
// 构造函数
public function __construct() {
}
// 获取实例
public static function getInstance() {
if (!self::$instance) {
self::$instance = new self;
}
return self::$instance;
}
/**
* 获取
* @param [type] $name [description]
* @param boolean $fail [description]
* @return [type] [description]
*/
public function get($name, $fail = false) {
if ($obj = $this->has($name)) {
return unserialize($obj->data);
} else {
return value($fail);
}
}
/**
* 设置
* @param [type] $name [description]
* @param [type] $data [description]
* @param integer $expiry [description]
*/
public function set($name, $data, $expiry = 0) {
$obj = new \stdClass();
$obj->data = serialize($data);
$obj->expiry = $expiry ? time() + $expiry : 0;
$file = self::getFile($name);
$dir = dirname($file);
if (!is_dir($dir)) {
dmkdir($dir,0777);
}
return (bool) file_put_contents($file, serialize($obj));
}
/**
* 是否有效
* @param [type] $name [description]
* @return object [description]
*/
public function has($name) {
$file = self::getFile($name);
// 文件不存在
if (!is_file($file)) {
return false;
}
// 非对象
$obj = unserialize(file_get_contents($file));
if (!is_object($obj)) {
unlink($file);
return false;
}
// 超过有效期
if ($obj->expiry && $obj->expiry < time()) {
unlink($file);
return false;
}
return $obj;
}
/**
* 移除
* @param [type] $name [description]
* @return [type] [description]
*/
public function remove($name) {
$file = self::getFile($name);
return !is_file($file) || unlink($file);
}
/**
* 移除所有
* @return [type] [description]
*/
public function removeAll() {
// 缓存目录
$dir = CACHE_PATH . 'cache/';
if ($handle = opendir($dir)) {
while (($file = readdir($handle)) !== false) {
if ($file != '.' && $file != '..') {
unlink($dir . $file);
}
}
}
return true;
}
/**
* 设置
* @param [type] $name [description]
* @param [type] $value [description]
*/
public function __set($name, $value) {
return $this->set($name, $value);
}
/**
* 获取
* @param [type] $name [description]
* @return [type] [description]
*/
public function __get($name) {
return $this->get($name);
}
/**
* 检查
* @param [type] $name [description]
* @return boolean [description]
*/
public function __isset($name) {
return $this->has($name);
}
/**
* 删除
* @param [type] $name [description]
*/
public function __unset($name) {
$this->remove($name);
}
/**
* 获取缓存文件名
* @param [type] $name [description]
* @return [type] [description]
*/
public static function getFile($name) {
return CACHE_PATH . 'cache/' . crc32($name) . '.ca';
}
}