php缓存加速程序工具apc、eAccelerator、xcache
主要有:
1.apc 不能和zend optimizer一起使用。
2.eAccelerator是可以和zend optimizer一起使用的.
3
<?php
/*
* Name: wrapperCache
* URL: http://www.admpub.com/
* Version: v0.1
* Date: 29/10/2010
* Author: Chema Garrido
* License: GPL v3
* Notes: wrapper cache for fileCache, memcache, APC, Xcache and eaccelerator
*/
class wrapperCache {
private $cache_params;//extra params for external caches like path or connection option memcached
public $cache_expire;//seconds that the cache expires
private $cache_type;//type of cache to use
private $cache_external; //external instance of cache, can be fileCache or memcache
private static $instance;//Instance of this class
// Always returns only one instance
public static function GetInstance($type=\'auto\',$exp_time=3600,$params=\'cache/\'){
if (!isset(self::$instance)){//doesn\'t exists the isntance
self::$instance = new self($type,$exp_time,$params);//goes to the constructor
}
return self::$instance;
}
//cache constructor, optional expiring time and cache path
private function __construct($type,$exp_time,$params){
$this->cache_expire=$exp_time;
$this->cache_params=$params;
$this->setCacheType($type);
}
public function __destruct() {
unset($this->cache_external);
}
// Prevent users to clone the instance
public function __clone(){
$this->cacheError(\'Clone is not allowed.\');
}
//deletes cache from folder
public function clearCache(){
switch($this->cache_type){
case \'eaccelerator\':
@eaccelerator_clean();
@eaccelerator_clear();
break;
case \'apc\':
apc_clear_cache(\'user\');
break;
case \'xcache\':
xcache_clear_cache(XC_TYPE_VAR, 0);
break;
case \'memcache\':
@$this->cache_external->flush();
break;
case \'filecache\':
$this->cache_external->deleteCache();
break;
}
}
//writes or reads the cache
public function cache($key, $value=\'\',$ttl=\'\'){
if ($value!=\'\'){//wants to write
if ($ttl==\'\') $ttl=$this->cache_expire;
$this->put($key, $value,$ttl);
}
else return $this->get($key);//reading value
}
//creates new cache files with the given data, $key== name of the cache, data the info/values to store
private function put($key,$data,$ttl=\'\' ){
if ($ttl==\'\') $ttl=$this->cache_expire;
switch($this->cache_type){
case \'eaccelerator\':
eaccelerator_put($key, serialize($data), $ttl);
break;
case \'apc\':
apc_store($key, $data, $ttl);
break;
case \'xcache\':
xcache_set($key, serialize($data), $ttl);
break;
case \'memcache\':
$data=serialize($data);
if (!$this->cache_external->replace($key, $data, false, $ttl))
$this->cache_external->set($key, $data, false, $ttl);
break;
case \'filecache\':
$this->cache_external->cache($key,$data);
break;
}
}
//returns cache for the given key
private function get($key){
switch($this->cache_type){
case \'eaccelerator\':
$data = @unserialize(eaccelerator_get($key));
break;
case \'apc\':
$data = apc_fetch($key);
break;
case \'xcache\':
$data = @unserialize(xcache_get($key));
break;
case \'memcache\':
$data = @unserialize($this->cache_external->get($key));
break;
case \'filecache\':
$data = $this->cache_external->cache($key);
break;
}
/*echo \'<br />--returnning data for key:\'.$key;
var_dump($data);*/
return $data;
}
//delete key from cache
public function delete($key){
switch($this->cache_type){
case \'eaccelerator\':
eaccelerator_rm($key);
break;
case \'apc\':
apc_delete($key);
break;
case \'xcache\':
xcache_unset($key);
break;
case \'memcache\':
$this->cache_external->delete($key);
break;
case \'filecache\':
$this->cache_external->delete($key);
break;
}
}
// Overloading for the Application variables and automatically cached
public function __set($name, $value) {
$this->put($name, $value, $this->cache_expire);
}
public function __get($name) {
return $this->get($name);
}
public function __isset($key) {//echo "Is \'$name\' set?\n"
if ($this->get($key) !== false) return true;
else return false;
}
public function __unset($name) {//echo "Unsetting \'$name\'\n";
$this->delete($name);
}
//end overloads
public function getCacheType(){
return $this->$this->cache_type;
}
//sets the cache if its installed if not triggers error
public function setCacheType($type){
$this->cache_type=strtolower($type);
switch($this->cache_type){
case \'eaccelerator\':
if (function_exists(\'eaccelerator_get\')) $this->cache_type = \'eaccelerator\';
else $this->cacheError(\'eaccelerator not found\');
break;
case \'apc\':
if (function_exists(\'apc_fetch\')) $this->cache_type = \'apc\' ;
else $this->cacheError(\'APC not found\');
break;
case \'xcache\':
if (function_exists(\'xcache_get\')) $this->cache_type = \'xcache\' ;
else $this->cacheError(\'Xcache not found\');
break;
case \'memcache\':
if (class_exists(\'Memcache\')) $this->init_memcache();
else $this->cacheError(\'memcache not found\');
break;
case \'filecache\':
if (class_exists(\'fileCache\'))$this->init_filecache();
else $this->cacheError(\'fileCache not found\');
break;
case \'auto\'://try to auto select a cache system
if (function_exists(\'eaccelerator_get\')) $this->cache_type = \'eaccelerator\';
elseif (function_exists(\'apc_fetch\')) $this->cache_type = \'apc\' ;
elseif (function_exists(\'xcache_get\')) $this->cache_type = \'xcache\' ;
elseif (class_exists(\'Memcache\')) $this->init_memcache();
elseif (class_exists(\'fileCache\')) $this->init_filecache();
else $this->cacheError(\'not any compatible cache was found\');
break;
default://not any cache selected or wrong one selected
if (isset($type)) $msg=\'Unrecognized cache type selected <b>\'.$type.\'</b>\';
else $msg=\'Not any cache type selected\';
$this->cacheError($msg);
break;
}
}
private function init_memcache(){//get instance of the memcache class
if (is_array($this->cache_params)){
$this->cache_type = \'memcache\';
$this->cache_external = new Memcache;
foreach ($this->cache_params as $server) {
$server[\'port\'] = isset($server[\'port\']) ? (int) $server[\'port\'] : ini_get(\'memcache.default_port\');
$server[\'persistent\'] = isset($server[\'persistent\']) ? (bool) $server[\'persistent\'] : true;
$this->cache_external->addServer($server[\'host\'], $server[\'port\'], $server[\'persistent\']);
}
}
else $this->cacheError(\'memcache needs an array, example:
wrapperCache::GetInstance(\\'memcache\\',30,array(array(\\'host\\'=>\\'localhost\\')));\');
}
private function init_filecache(){//get instance of the filecache class
$this->cache_type = \'filecache\';
$this->cache_external = fileCache::GetInstance($this->cache_expire,$this->cache_params);
}
public function getAvailableCache($return_format=\'html\'){//returns the available cache
$avCaches = array();
$avCaches[] = array(\'eaccelerator\',function_exists(\'eaccelerator_get\'));
$avCaches[] = array(\'apc\',function_exists(\'apc_fetch\')) ;
$avCaches[] = array(\'xcache\',function_exists(\'xcache_get\'));
$avCaches[] = array(\'memcache\',class_exists(\'Memcache\'));
$avCaches[] = array(\'fileCache\',class_exists(\'fileCache\'));
if ($return_format==\'html\'){
$ret=\'<ul>\';
foreach ($avCaches as $c){
$ret.=\'<li>\'.$c[0].\' - \';
if ($c[1]) $ret.=\'Found/Compatible\';
else $ret.=\'Not Found/Incompatible\';
$ret.=\'</ll>\';
}
return $ret.\'</ul>\';
}
else return $avCaches;
}
private function cacheError($msg){//triggers error
trigger_error(\'<br /><b>wrapperCache error</b>: \'.$msg.
\'<br />If you want you can try with \\'auto\\' for auto select a compatible cache.
<br />Or choose a supported cache from list:\'.$this->getAvailableCache(), E_USER_ERROR);
}
}
?>