codelifezj

php缓存加速程序工具apc、eAccelerator、xcache

主要有:

1.apc 不能和zend optimizer一起使用。

2.eAccelerator是可以和zend optimizer一起使用的.

 

<?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);
    }
}
?> 

  

分类:

技术点:

相关文章: