[pLog-svn] r2911 - in plog/trunk/class/cache: . Cache_Lite

Mark Wu markplace at gmail.com
Tue Feb 7 09:36:55 GMT 2006


Hi Oscar:

I just upgrade the cache_lite to 1.6.0.

Need your help on the $this->log->log(blahblahblah) error. Actually, it
wasn't work...

Mark

> -----Original Message-----
> From: plog-svn-bounces at devel.lifetype.net 
> [mailto:plog-svn-bounces at devel.lifetype.net] On Behalf Of 
> mark at devel.lifetype.net
> Sent: Tuesday, February 07, 2006 5:13 PM
> To: plog-svn at devel.lifetype.net
> Subject: [pLog-svn] r2911 - in plog/trunk/class/cache: . Cache_Lite
> 
> Author: mark
> Date: 2006-02-07 09:13:07 +0000 (Tue, 07 Feb 2006) New Revision: 2911
> 
> Modified:
>    plog/trunk/class/cache/Cache_Lite/Lite.php
>    plog/trunk/class/cache/cache.class.php
>    plog/trunk/class/cache/cachemanager.class.php
> Log:
> Some cache bug fix, and also upgrade the cahe_lite to 1.6.0.
> 
> 1. I move the option modification to cache.class.php. It is 
> will be eaiser for us when we want to upgrade to cache_lite 
> 1.7.0 next time.
> 2 the log command $this->log->log(blahblahblah) seems not working.
> 
> Modified: plog/trunk/class/cache/Cache_Lite/Lite.php
> ===================================================================
> --- plog/trunk/class/cache/Cache_Lite/Lite.php	
> 2006-02-06 17:02:51 UTC (rev 2910)
> +++ plog/trunk/class/cache/Cache_Lite/Lite.php	
> 2006-02-07 09:13:07 UTC (rev 2911)
> @@ -10,19 +10,16 @@
>  * There are some examples in the 'docs/examples' file
>  * Technical choices are described in the 'docs/technical' file
>  *
> -* A tutorial is available in english at this url :
> -* http://www.pearfr.org/index.php/en/article/cache_lite
> -* (big thanks to Pierre-Alain Joye for the translation)
> -*
> -* The same tutorial is also available in french at this url :
> -* http://www.pearfr.org/index.php/fr/article/cache_lite
> -*
>  * Memory Caching is from an original idea of
>  * Mike BENOIT <ipso at snappymail.ca>
>  *
> +* Nota : A chinese documentation (thanks to RainX 
> <china_1982 at 163.com>) 
> +is
> +* available at :
> +* http://rainx.phpmore.com/manual/cache_lite.html
> +*
>  * @package Cache_Lite
>  * @category Caching
> -* @version $Id: Lite.php,v 1.23 2005/02/27 18:24:28 fab Exp $
> +* @version $Id: Lite.php,v 1.37 2005/11/24 20:10:01 fab Exp $
>  * @author Fabien MARTY <fab at php.net>
>  */
>  
> @@ -31,7 +28,7 @@
>  define('CACHE_LITE_ERROR_RETURN', 1);
>  define('CACHE_LITE_ERROR_DIE', 8);
>  
> -class Cache_Lite 
> +class Cache_Lite
>  {
>  
>      // --- Private properties ---
> @@ -56,9 +53,11 @@
>      /**
>      * Cache lifetime (in seconds)
>      *
> +    * If null, the cache is valid forever.
> +    *
>      * @var int $_lifeTime
>      */
> -    var $_lifeTime = 604800;
> +    var $_lifeTime = 3600;
>  
>      /**
>      * Enable / disable fileLocking
> @@ -108,7 +107,7 @@
>      *
>      * @var boolean $_writeControl
>      */
> -    var $_readControl = false;
> +    var $_readControl = true;
>  
>      /**
>      * Type of read control (only if read control is enabled) 
> @@ -123,6 +122,16 @@
>      var $_readControlType = 'crc32';
>  
>      /**
> +    * Pear error mode (when raiseError is called)
> +    *
> +    * (see PEAR doc)
> +    *
> +    * @see setToDebug()
> +    * @var int $_pearErrorMode
> +    */
> +    var $_pearErrorMode = CACHE_LITE_ERROR_RETURN;
> +    
> +    /**
>      * Current cache id
>      *
>      * @var string $_id
> @@ -194,7 +203,7 @@
>      *
>      * @var boolean $_serialize
>      */
> -    var $_automaticSerialization = true;
> +    var $_automaticSerialization = false;
>      
>      /**
>      * Disable / Tune the automatic cleaning process @@ 
> -212,11 +221,23 @@
>      /**
>      * Nested directory level
>      *
> +    * Set the hashed directory structure level. 0 means "no 
> hashed directory 
> +    * structure", 1 means "one level of directory", 2 means 
> "two levels"... 
> +    * This option can speed up Cache_Lite only when you have 
> many thousands of 
> +    * cache file. Only specific benchs can help you to 
> choose the perfect value 
> +    * for you. Maybe, 1 or 2 is a good start.
>      *
>      * @var int $_hashedDirectoryLevel
>      */
> -    var $_hashedDirectoryLevel = 2;
> +    var $_hashedDirectoryLevel = 0;
>      
> +    /**
> +    * Umask for hashed directory structure
> +    *
> +    * @var int $_hashedDirectoryUmask
> +    */
> +    var $_hashedDirectoryUmask = 0700;
> +    
>      // --- Public methods ---
>  
>      /**
> @@ -239,6 +260,7 @@
>      *     'automaticSerialization' => enable / disable 
> automatic serialization (boolean)
>      *     'automaticCleaningFactor' => distable / tune 
> automatic cleaning process (int)
>      *     'hashedDirectoryLevel' => level of the hashed 
> directory system (int)
> +    *     'hashedDirectoryUmask' => umask for hashed 
> directory structure (int)
>      * );
>      *
>      * @param array $options options
> @@ -246,24 +268,30 @@
>      */
>      function Cache_Lite($options = array(NULL))
>      {
> -        // original options
> -        // $availableOptions = array('hashedDirectoryLevel', 
> 'automaticCleaningFactor', 'automaticSerialization', 
> 'fileNameProtection', 'memoryCaching', 'onlyMemoryCaching', 
> 'memoryCachingLimit', 'cacheDir', 'caching', 'lifeTime', 
> 'fileLocking', 'writeControl', 'readControl', 
> 'readControlType', 'pearErrorMode');
> -        // options really needed by pLog
> -        $availableOptions = array('cacheDir');
>          foreach($options as $key => $value) {
> -            if(in_array($key, $availableOptions)) {
> -                $property = '_'.$key;
> -                $this->$property = $value;
> -            }
> +            $this->setOption($key, $value);
>          }
> -        $this->_refreshTime = time() - $this->_lifeTime;
> -
> -        // activate memory caching if available memory is 
> 24M or above
> -        if( $this->byteValue(ini_get('memory_limit')) >= 25165824 )
> -            $this->_memoryCaching = true;
> +        $this->_setRefreshTime();
>      }
>      
>      /**
> +    * Generic way to set a Cache_Lite option
> +    *
> +    * see Cache_Lite constructor for available options
> +    *
> +    * @var string $name name of the option
> +    * @var mixed $value value of the option
> +    * @access public
> +    */
> +    function setOption($name, $value) {
> +        $availableOptions = array('hashedDirectoryUmask', 
> 'hashedDirectoryLevel', 'automaticCleaningFactor', 
> 'automaticSerialization', 'fileNameProtection', 
> 'memoryCaching', 'onlyMemoryCaching', 'memoryCachingLimit', 
> 'cacheDir', 'caching', 'lifeTime', 'fileLocking', 
> 'writeControl', 'readControl', 'readControlType', 'pearErrorMode');
> +        if (in_array($name, $availableOptions)) {
> +            $property = '_'.$name;
> +            $this->$property = $value;
> +        }
> +    }
> +    
> +    /**
>      * Test if a cache is available and (if yes) return it
>      *
>      * @param string $id cache id
> @@ -292,7 +320,7 @@
>                      }
>                  }
>              }
> -            if ($doNotTestCacheValidity) {
> +            if (($doNotTestCacheValidity) || 
> + (is_null($this->_refreshTime))) {
>                  if (file_exists($this->_file)) {
>                      $data = $this->_read();
>                  }
> @@ -302,7 +330,7 @@
>                  }
>              }
>              if (($data) and ($this->_memoryCaching)) {
> -                $this->_memoryCacheAdd($this->_file, $data);
> +                $this->_memoryCacheAdd($data);
>              }
>              if (($this->_automaticSerialization) and 
> (is_string($data))) {
>                  $data = unserialize($data); @@ -331,16 +359,16 @@
>                  $this->_setFileName($id, $group);
>              }
>              if ($this->_memoryCaching) {
> -                $this->_memoryCacheAdd($this->_file, $data);
> +                $this->_memoryCacheAdd($data);
>                  if ($this->_onlyMemoryCaching) {
>                      return true;
>                  }
>              }
> -            if ($this->_automaticCleaningFactor>0) {
> +	    if ($this->_automaticCleaningFactor>0) {
>                  $rand = rand(1, $this->_automaticCleaningFactor);
> -                if ($rand==1) {
> -                    $this->clean(false, 'old');
> -                }
> +	        if ($rand==1) {
> +	            $this->clean(false, 'old');
> +		}
>              }
>              if ($this->_writeControl) {
>                  if (!$this->_writeAndControl($data)) { @@ 
> -350,8 +378,8 @@
>                      return true;
>                  }
>              } else {
> -                return $this->_write($data);
> -            }
> +	        return $this->_write($data);
> +	    }
>          }
>          return false;
>      }
> @@ -386,7 +414,8 @@
>      * else only cache files of the specified group will be destroyed
>      *
>      * @param string $group name of the cache group
> -    * @param string $mode flush cache mode : 'old', 
> 'ingroup', 'notingroup'
> +    * @param string $mode flush cache mode : 'old', 
> 'ingroup', 'notingroup', 
> +    *                                        'callback_myFunction'
>      * @return boolean true if no problem
>      * @access public
>      */
> @@ -417,7 +446,7 @@
>      function setLifeTime($newLifeTime)
>      {
>          $this->_lifeTime = $newLifeTime;
> -        $this->_refreshTime = time() - $newLifeTime;
> +        $this->_setRefreshTime();
>      }
>  
>      /**
> @@ -466,12 +495,25 @@
>      * @return int last modification time
>      */
>      function lastModified() {
> -        return filemtime($this->_file);
> +        return @filemtime($this->_file);
>      }
>      
>      // --- Private methods ---
> -
> +    
>      /**
> +    * Compute & set the refresh time
> +    *
> +    * @access private
> +    */
> +    function _setRefreshTime() {
> +        if (is_null($this->_lifeTime)) {
> +            $this->_refreshTime = null;
> +        } else {
> +            $this->_refreshTime = time() - $this->_lifeTime;
> +        }
> +    }
> +    
> +    /**
>      * Remove a file
>      * 
>      * @param string $file complete file path and name @@ 
> -480,7 +522,7 @@
>      */
>      function _unlink($file)
>      {
> -        if (file_exists($file) && !@unlink($file)) {
> +        if (!@unlink($file)) {
>              $this->log->log('Unable to remove cache !', 
> LOGGER_PRIO_ERROR );
>              return false;
>          } else {
> @@ -493,7 +535,8 @@
>      *
>      * @param string $dir directory complete path (with a 
> trailing slash)
>      * @param string $group name of the cache group
> -    * @param string $mode flush cache mode : 'old', 
> 'ingroup', 'notingroup'
> +    * @param string $mode flush cache mode : 'old', 
> 'ingroup', 'notingroup',
> +                                             'callback_myFunction'
>      * @return boolean true if no problem
>      * @access private
>      */
> @@ -505,7 +548,7 @@
>              $motif = ($group) ? 'cache_'.$group.'_' : 'cache_';
>          }
>          if ($this->_memoryCaching) {
> -            while (list($key, $value) = 
> each($this->_memoryCachingArray)) {
> +            while (list($key, ) = each($this->_memoryCachingArray)) {
>                  if (strpos($key, $motif, 0)) {
>                      unset($this->_memoryCachingArray[$key]);
>                      $this->_memoryCachingCounter = 
> $this->_memoryCachingCounter - 1; @@ -525,18 +568,26 @@
>                  if (substr($file, 0, 6)=='cache_') {
>                      $file2 = $dir . $file;
>                      if (is_file($file2)) {
> -                        switch ($mode) {
> +                        switch (substr($mode, 0, 9)) {
>                              case 'old':
>                                  // files older than lifeTime 
> get deleted from cache
> -                                if ((mktime() - 
> filemtime($file2)) > $this->_lifeTime) {
> -                                    $result = ($result and 
> ($this->_unlink($file2)));
> +                                if (!is_null($this->_lifeTime)) {
> +                                    if ((mktime() - 
> filemtime($file2)) > $this->_lifeTime) {
> +                                        $result = ($result 
> and ($this->_unlink($file2)));
> +                                    }
>                                  }
>                                  break;
> -                            case 'notingroup':
> +                            case 'notingrou':
>                                  if (!strpos($file2, $motif, 0)) {
>                                      $result = ($result and 
> ($this->_unlink($file2)));
>                                  }
>                                  break;
> +                            case 'callback_':
> +                                $func = substr($mode, 9, 
> strlen($mode) - 9);
> +                                if ($func($file2, $group)) {
> +                                    $result = ($result and 
> ($this->_unlink($file2)));
> +                                }
> +                                break;
>                              case 'ingroup':
>                              default:
>                                  if (strpos($file2, $motif, 
> 0)) { @@ -557,15 +608,14 @@
>      /**
>      * Add some date in the memory caching array
>      *
> -    * @param string $id cache id
>      * @param string $data data to cache
>      * @access private
>      */
> -    function _memoryCacheAdd($id, $data)
> +    function _memoryCacheAdd($data)
>      {
>          $this->_memoryCachingArray[$this->_file] = $data;
>          if ($this->_memoryCachingCounter >= 
> $this->_memoryCachingLimit) {
> -            list($key, $value) = each($this->_memoryCachingArray);
> +            list($key, ) = each($this->_memoryCachingArray);
>              unset($this->_memoryCachingArray[$key]);
>          } else {
>              $this->_memoryCachingCounter = 
> $this->_memoryCachingCounter + 1; @@ -617,23 +667,28 @@
>                  $hashControl = @fread($fp, 32);
>                  $length = $length - 32;
>              } 
> -            $data = @fread($fp, $length);
> +            if ($length) {
> +                $data = @fread($fp, $length);
> +            } else {
> +                $data = '';
> +            }
>              set_magic_quotes_runtime($mqr);
>              if ($this->_fileLocking) @flock($fp, LOCK_UN);
>              @fclose($fp);
>              if ($this->_readControl) {
>                  $hashData = $this->_hash($data, 
> $this->_readControlType);
> -                if ($hashData == false) {
> -                    return false;
> -                }
>                  if ($hashData != $hashControl) {
> -                    @touch($this->_file, time() - 
> 2*abs($this->_lifeTime)); 
> +                    if (is_null($this->_lifeTime)) {
> +                        @touch($this->_file, time() - 
> 2*abs($this->_lifeTime)); 
> +                    } else {
> +                        @unlink($this->_file);
> +                    }
>                      return false;
>                  }
>              }
>              return $data;
>          }
> -        $this->log->log( 'Unable to read cache !', 
> LOGGER_PRIO_ERROR );   
> +        $this->log->log( 'Unable to read cache !', 
> LOGGER_PRIO_ERROR );
>          return false;
>      }
>      
> @@ -646,41 +701,37 @@
>      */
>      function _write($data)
>      {
> -        $this->_createCacheDir();
> -        $fp = @fopen($this->_file, 'w');
> -        if ($fp) {
> -            if ($this->_fileLocking) @flock($fp, LOCK_EX);
> -            if ($this->_readControl) {
> -                $hashData = $this->_hash($data, 
> $this->_readControlType);
> -                if ($hasData) 
> -                    @fwrite($fp, $hasData, 32);
> -                else
> -                    return false;
> +        $try = 1;
> +        while ($try<=2) {
> +            $fp = @fopen($this->_file, "wb");
> +            if ($fp) {
> +                if ($this->_fileLocking) @flock($fp, LOCK_EX);
> +                if ($this->_readControl) {
> +                    @fwrite($fp, $this->_hash($data, 
> $this->_readControlType), 32);
> +                }
> +                $len = strlen($data);
> +                @fwrite($fp, $data, $len);
> +                if ($this->_fileLocking) @flock($fp, LOCK_UN);
> +                @fclose($fp);
> +                return true;
> +            } else {
> +                if (($try==1) and ($this->_hashedDirectoryLevel>0)) {
> +                    $hash = md5($this->_fileName);
> +                    $root = $this->_cacheDir;
> +                    for ($i=0 ; 
> $i<$this->_hashedDirectoryLevel ; $i++) {
> +                        $root = $root . 'cache_' . 
> substr($hash, 0, $i + 1) . '/';
> +                        @mkdir($root, $this->_hashedDirectoryUmask);
> +                    }
> +                    $try = 2;
> +                } else {
> +                    $try = 999;
> +                }
>              }
> -            $len = strlen($data);
> -            @fwrite($fp, $data, $len);
> -            if ($this->_fileLocking) @flock($fp, LOCK_UN);
> -            @fclose($fp);
> -            return true;
>          }
>          $this->log->log('Unable to write cache file : 
> '.$this->_file, LOGGER_PRIO_ERROR );
>          return false;
>      }
> -
> -    function _createCacheDir()
> -    {
> -        if (($this->_hashedDirectoryLevel>0)) {
> -            $hash = md5($this->_fileName);
> -            $root = $this->_cacheDir;
> -            for ($i=0 ; $i<$this->_hashedDirectoryLevel ; $i++) {
> -                $root = $root . 'cache_' . substr($hash, 0, 
> $i + 1) . '/';
> -                if (!is_dir($root)) {
> -                    @mkdir($root, 0700);
> -                }
> -            }
> -        }
> -    }
> -    
> +       
>      /**
>      * Write the given data in the cache file and control it 
> just after to avoir corrupted cache entries
>      *
> @@ -718,22 +769,8 @@
>                              LOGGER_PRIO_ERROR );
>              return false;
>          }
> +        return false;
>      }
> -
> -    function byteValue($val) {
> -       $val = trim($val);
> -       $last = strtolower($val{strlen($val)-1});
> -       switch($last) {
> -           case 'g':
> -               $val *= 1024;
> -           case 'm':
> -               $val *= 1024;
> -           case 'k':
> -               $val *= 1024;
> -       }
> -
> -       return $val;
> -    }
>      
>  } 
>  
> 
> Modified: plog/trunk/class/cache/cache.class.php
> ===================================================================
> --- plog/trunk/class/cache/cache.class.php	2006-02-06 
> 17:02:51 UTC (rev 2910)
> +++ plog/trunk/class/cache/cache.class.php	2006-02-07 
> 09:13:07 UTC (rev 2911)
> @@ -67,10 +67,10 @@
>  			
>  				$__cache_queries++;
>  
> -                $inCache = $this->cache->get( $id, $group );
> +                $data = $this->cache->get( $id, $group );
>  
>                  if( DEBUG_ENABLED && DEBUG_CHANNELS & 
> DEBUG_CHANNEL_CACHE )
> -                    if ($inCache) {
> +                    if ($data) {
>                          $this->debug->log("Cache hit for $id 
> ($group): $data", LOGGER_PRIO_INFO );
>  						$__cache_hits++;
>  					}
> @@ -79,7 +79,7 @@
>  						
> $__cache_misses++;						
>  					}
>  
> -                return $inCache;
> +                return $data;
>              } else {
>                  return false;
>  			}
> 
> Modified: plog/trunk/class/cache/cachemanager.class.php
> ===================================================================
> --- plog/trunk/class/cache/cachemanager.class.php	
> 2006-02-06 17:02:51 UTC (rev 2910)
> +++ plog/trunk/class/cache/cachemanager.class.php	
> 2006-02-07 09:13:07 UTC (rev 2911)
> @@ -10,8 +10,6 @@
>      define( "CACHE_USERALBUMS",        "useralbums" );
>      define( "CACHE_USERINFO",          "userinfo" );
>      define( "CACHE_USERIDBYNAME",      "userinfo_idbyname" );
> -    define( "CACHE_TRACKBACKS",        "trackbacks" );
> -    define( "CACHE_NUMTRACKBACKS",     "trackbacks_size" );
>      define( "CACHE_CONFIGDBSTORAGE",   "config_db_storage" );
>      define( "CACHE_SITEADMINS",        "permissions_siteadmin" );
>      define( "CACHE_BLOGLINKS",         "blogLinks" );
> @@ -56,7 +54,11 @@
>                  // define defaults
>                  $cacheParameter = array(
>                      'cacheDir' => "./tmp/",
> -                     );
> +                    'lifeTime' => 604800,
> +                    'readControl' => false,
> +                    'automaticSerialization' => true,
> +                    'hashedDirectoryLevel' => 2
> +                );
>  
>                  // build a new cache object
>                  $cache =& new Cache( $cacheParameter);
> 
> _______________________________________________
> pLog-svn mailing list
> pLog-svn at devel.lifetype.net
> http://devel.lifetype.net/mailman/listinfo/plog-svn



More information about the pLog-svn mailing list