Changeset 19b5ce


Ignore:
Timestamp:
11/11/13 21:51:57 (4 years ago)
Author:
pierre-alain <pierre-alain@…>
Branches:
master
Children:
cb5dd1
Parents:
26a5fe
git-author:
pierre-alain <pierre-alain@…> (11/11/13 21:51:57)
git-committer:
pierre-alain <pierre-alain@…> (11/11/13 21:51:57)
Message:

add support for memcache

Files:
3 added
3 edited

Legend:

Unmodified
Added
Removed
  • OWR/Cache.php

    rb65617 r19b5ce  
    3636 */ 
    3737namespace OWR; 
    38 use OWR\View\Utilities; 
    3938/** 
    4039 * This object manages cache files 
     
    4342class Cache 
    4443{ 
     44    /** 
     45     * @var string name of cache object class 
     46     * @access private 
     47     */ 
     48    static private $__instance; 
     49 
    4550    /** 
    4651     * Constructor 
     
    5156 
    5257    /** 
    53      * Delete every files found in cache directory 
     58     * Init cache object string 
    5459     * 
    5560     * @author Pierre-Alain Mignot <contact@openwebreader.org> 
    56      * @access public 
     61     * @access protected 
    5762     * @static 
    58      * @param string $dir a directory in cache/ 
    59      * @param boolean $maintenance must-we just check for the lastmtime ? 
    60      * @return int number of deleted files 
    6163     */ 
    62     static public function clear($dir = '', $maintenance = false) 
     64    static protected function _init() 
    6365    { 
    64         $dir = HOME_PATH.'cache'.DIRECTORY_SEPARATOR.(string)$dir; 
     66        if(isset(self::$__instance)) return true; 
    6567 
    66         $nb = 0; 
    67  
    68         clearstatcache(); 
    69  
    70         if(!file_exists($dir)) return $nb; 
    71  
    72         $cache = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($dir)); 
    73  
    74         if($maintenance) 
    75         { 
    76             $now = Config::iGet()->get('begintime'); 
    77             $cacheTime = Config::iGet()->get('cacheTime'); 
    78         } 
    79  
    80         foreach($cache as $file) 
    81         { 
    82             if(!$cache->isDot() && !$cache->isDir() && $cache->isWritable()) 
    83             { 
    84                 if($maintenance && ($cache->getMTime() + $cacheTime < $now)) 
    85                 { 
    86                     continue; 
    87                 } 
    88  
    89                 $nb += (int) unlink((string) $file); 
    90             } 
    91         } 
    92  
    93         return $nb; 
     68        self::$__instance = 'memcache' === Config::iGet()->get('cacheType') ? 'OWR\Cache\Memcache' : 'OWR\Cache\CFile'; 
    9469    } 
    9570 
    9671    /** 
    97      * Delete every files found in DB cache directory 
     72     * Wrapper for cache object methods 
    9873     * 
    9974     * @author Pierre-Alain Mignot <contact@openwebreader.org> 
     
    10176     * @static 
    10277     */ 
    103     static public function clearDB() 
     78    static public function __callStatic($name, $args) 
    10479    { 
    105         return self::clear('db'); 
    106     } 
     80        self::_init(); 
    10781 
    108     /** 
    109      * Delete every files found in HTML cache directories 
    110      * 
    111      * @author Pierre-Alain Mignot <contact@openwebreader.org> 
    112      * @access public 
    113      * @static 
    114      */ 
    115     static public function clearHTML() 
    116     { 
    117         !file_exists(HOME_PATH.'cache'.DIRECTORY_SEPARATOR.'translations_fr_FR') || @unlink(HOME_PATH.'cache'.DIRECTORY_SEPARATOR.'translations_fr_FR'); 
    118         !file_exists(HOME_PATH.'cache'.DIRECTORY_SEPARATOR.'translations_en_US') || @unlink(HOME_PATH.'cache'.DIRECTORY_SEPARATOR.'translations_en_US'); 
    119         return (self::clear('fr_FR') + self::clear('en_US')); 
    120     } 
     82        if(!method_exists(self::$__instance, $name)) 
     83            throw new Exception(sprintf(Utilities::iGet()->_('Invalid action "%s"'), self::$__instance . '::' . $name), Exception::E_OWR_DIE); 
    12184 
    122     /** 
    123      * Try to get serialized datas from cache 
    124      * This function uses file locking 
    125      * 
    126      * @author Pierre-Alain Mignot <contact@openwebreader.org> 
    127      * @static 
    128      * @param string $filename cache file name 
    129      * @param int $cacheTime cache life time 
    130      * @return mixed 
    131      * @access public 
    132      */ 
    133     static public function get($filename, $cacheTime=0) 
    134     { 
    135         $filename = HOME_PATH.'cache'.DIRECTORY_SEPARATOR.$filename; 
    136  
    137         $cacheTime = (int)$cacheTime; 
    138  
    139         if(!file_exists($filename) || ($cacheTime > 0 && (time() > (@filemtime($filename) + $cacheTime)))) 
    140             return false; 
    141  
    142         if(!($fh = @fopen($filename, 'rb'))) return false; 
    143  
    144         @flock($fh, LOCK_SH); 
    145         $datas = @stream_get_contents($fh); 
    146         @fclose($fh); 
    147  
    148         if(false === $datas) return false; 
    149  
    150         return (@unserialize(base64_decode($datas, true))); 
    151     } 
    152  
    153     /** 
    154      * Try to write serialized datas into cache 
    155      * This function uses file locking 
    156      * 
    157      * @author Pierre-Alain Mignot <contact@openwebreader.org> 
    158      * @static 
    159      * @param string $filename cache file name 
    160      * @param string $datas datas to store in cache 
    161      * @return mixed 
    162      * @access public 
    163      */ 
    164     static public function write($filename, $datas) 
    165     { 
    166         $filename = HOME_PATH.'cache'.DIRECTORY_SEPARATOR.$filename; 
    167  
    168         $dir = dirname($filename); 
    169         if(!is_dir($dir)) 
    170         { 
    171             if(file_exists($dir) && !@unlink($dir)) return false; 
    172             if(!@mkdir($dir)) return false; 
    173         } 
    174  
    175         $fh = @fopen($filename, 'w+b'); 
    176         if(!$fh) return false; 
    177  
    178         @flock($fh, LOCK_EX); 
    179         $ret = @fwrite($fh, base64_encode(serialize($datas))); 
    180         @fclose($fh); 
    181  
    182         return $ret; 
    183     } 
    184  
    185     /** 
    186      * Check that the directory is writeable 
    187      * It will try to create it if it does not exists 
    188      * 
    189      * @author Pierre-Alain Mignot <contact@openwebreader.org> 
    190      * @static 
    191      * @param string $dir the directory's name 
    192      * @return mixed 
    193      * @access public 
    194      */ 
    195     static public function checkDir($dir) 
    196     { 
    197         $dir = HOME_PATH.'cache'.DIRECTORY_SEPARATOR.$dir; 
    198  
    199         if(is_dir($dir)) 
    200         { 
    201             if(!is_writeable($dir)) 
    202             { 
    203                 Logs::iGet()->log(sprintf(Utilities::iGet()->_('The directory "%s" is not writeable'), $dir)); 
    204                 return false; 
    205             } 
    206         } 
    207         elseif(file_exists($dir)) 
    208         { 
    209             if(!@unlink($dir)) 
    210             { 
    211                 Logs::iGet()->log(sprintf(Utilities::iGet()->_('The file "%s" exists, is not a dir and can not be removed'), $dir)); 
    212                 return false; 
    213             } 
    214  
    215         } 
    216         else 
    217         { 
    218             if(is_writeable(HOME_PATH.'cache')) 
    219             { 
    220                 if(!@mkdir($dir)) 
    221                 { // hu ? 
    222                     Logs::iGet()->log(sprintf(Utilities::iGet()->_('Can not create the directory "%s"'), $dir)); 
    223                     return false; 
    224                 } 
    225             } 
    226             else 
    227             { 
    228                 Logs::iGet()->log(Utilities::iGet()->_('The directory "%s" is not writeable', HOME_PATH.'cache')); 
    229                 return false; 
    230             } 
    231         } 
    232  
    233         return true; 
    234     } 
    235  
    236  
    237     /** 
    238      * Returns a unique filename 
    239      * 
    240      * @author Pierre-Alain Mignot <contact@openwebreader.org> 
    241      * @param boolean $tmp if we must use default tmp dir, default to false 
    242      * @return string the file name 
    243      * @access public 
    244      */ 
    245     static public function getRandomFilename($tmp = false) 
    246     { 
    247         $dir = $tmp ? Config::iGet()->get('defaultTmpDir') : PATH.'cache/'; 
    248         return tempnam($dir, 'OWR'); 
     85        return call_user_func_array(array(self::$__instance, $name), $args); 
    24986    } 
    25087} 
  • OWR/View.php

    rb65617 r19b5ce  
    101101        if($cacheTime > 0) 
    102102        { 
    103             $cachedTpl = HOME_PATH.'cache'.DIRECTORY_SEPARATOR.User::iGet()->getLang().DIRECTORY_SEPARATOR.md5($tpl.serialize($datas)); 
    104             if(file_exists($cachedTpl) && (@filemtime($cachedTpl) <= (int)(Config::iGet()->get('begintime') + $cacheTime)) && 
    105                 ($f = @fopen($cachedTpl, 'rb'))) 
    106             { 
    107                 @flock($f, LOCK_SH); 
    108                 $contents = stream_get_contents($f); 
    109                 @flock($f, LOCK_UN); 
    110                 @fclose($f); 
    111             } 
    112         } 
    113  
    114         if(!isset($contents)) 
    115         { 
    116             extract($datas, EXTR_SKIP); 
    117             ob_start(); 
    118             include HOME_PATH.'tpl'.DIRECTORY_SEPARATOR.$tpl.'.html'; 
    119             $contents = ob_get_clean(); 
     103            $cachedTpl = User::iGet()->getLang().DIRECTORY_SEPARATOR.md5($tpl.serialize($datas)); 
     104            $contents = Cache::get($cachedTpl, $cacheTime); 
     105        } 
     106 
     107        if(!isset($contents) || false === $contents) 
     108        { // nothing found in cache 
     109            $contents = $this->_execute($tpl, $datas); 
    120110 
    121111            if($cacheTime > 0) 
    122112            { 
    123                 $f = @fopen($cachedTpl, 'w+b'); 
    124                 if($f) 
    125                 { 
    126                     @flock($f, LOCK_EX); 
    127                     @fwrite($f, $contents); 
    128                     @flock($f, LOCK_UN); 
    129                     @fclose($f); 
    130                 } 
     113                Cache::write($cachedTpl, $contents); 
    131114            } 
    132115        } 
     
    146129 
    147130    /** 
    148      * Returns the added microtime of all rendering 
     131     * Executes specified template and returns generated content 
     132     * 
     133     * @access public 
     134     * @author Pierre-Alain Mignot <contact@openwebreader.org> 
     135     * @param string $tpl the template name 
     136     * @param array $datas the datas 
     137     * @return string the template rendered 
     138     */ 
     139    protected function _execute($tpl, array $datas) 
     140    { 
     141        extract($datas, EXTR_SKIP); 
     142        ob_start(); 
     143        include HOME_PATH.'tpl'.DIRECTORY_SEPARATOR.$tpl.'.html'; 
     144        return ob_get_clean();    
     145    } 
     146 
     147    /** 
     148     * Returns the added microtime of all rendering processing 
    149149     * 
    150150     * @access public 
  • install/cfg-dist.php

    rb65617 r19b5ce  
    7676/* templates cache time, default to 24h * 7 */ 
    7777$cfg['cacheTime']               = 86400 * 7; 
     78/* use file or memcache as cache */ 
     79$cfg['cacheType']               = 'file'; 
     80/* memcache hosts, for multiples server add comma-separated values */ 
     81$cfg['memcache']                = '127.0.0.1:11211'; 
    7882/* session life time, default to 24h */ 
    7983$cfg['sessionLifeTime']         = 86400; 
Note: See TracChangeset for help on using the changeset viewer.