php按需加载缓存扩展
哎,一套代码更换了服务器环境就经常因为加载的扩展的不同,导致一些代码出问题。
比如缓存,使用缓存可以减少系统的重复计算,比如一个计算结果,或者读取的数据库的配置信息,第一次获取之后,一段时间内,都是不会修改的,如果每次重复读取或者计算就会浪费系统资源,所以缓存就存在了。
我目前使用的缓存,一般也就是apcu,memcached,redis,编一段代码,可以检测扩展,自动使用对应的缓存,即使后续发生其他变化了,只需要修改这段代码就可以。
<?php
interface cache {
public function set($key, $value, $ttl);
public function get($key);
}
class ApcuCache implements cache {
public function set($key, $value, $ttl) {
return apcu_store($key, $value, $ttl);
}
public function get($key) {
return apcu_fetch($key);
}
}
class MemcachedCache implements cache {
private static $instance = null;
private function __construct() {
$this->memcached = new Memcached();
$this->memcached->addServer('localhost', 11211);
}
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new MemcachedCache();
}
return self::$instance;
}
public function set($key, $value, $ttl) {
return $this->memcached->set($key, $value, $ttl);
}
public function get($key) {
return $this->memcached->get($key);
}
}
class RedisCache implements cache {
private static $instance = null;
private function __construct() {
$this->redis = new Redis();
$this->redis->connect('127.0.0.1', 6379);
}
public static function getInstance() {
if (self::$instance === null) {
self::$instance = new RedisCache();
}
return self::$instance;
}
public function set($key, $value, $ttl) {
return $this->redis->setex($key, $ttl, $value);
}
public function get($key) {
return $this->redis->get($key);
}
}
function getcaches() {
static $cache=null;
if($cache===null){
$cacheTypes = [
'apcu' => ApcuCache::class,
'memcached' => MemcachedCache::class,
'redis' => RedisCache::class,
];
$cache=false;
foreach ($cacheTypes as $extension => $class) {
if (extension_loaded($extension)) {
$cache=new $class();
break;
}
}
}
return $cache;
}
function caset($key, $value, $ttl = 0) {
$cache = getcaches();
if ($cache) {
return $cache->set($key, $value, $ttl);
}
return false;
}
function caget($key) {
$cache = getcaches();
if ($cache) {
return $cache->get($key);
}
return false;
}
使用方法
caset($key,$value,3600);#设置 $value=caget($key);#获取