[ Index ]
 

Code source de PHP PEAR 1.4.5

Accédez au Source d'autres logiciels libresSoutenez Angelica Josefina !

title

Body

[fermer]

/Cache/ -> OutputCompression.php (source)

   1  <?php
   2  // +----------------------------------------------------------------------+
   3  // | PEAR :: Cache                                                        |
   4  // +----------------------------------------------------------------------+
   5  // | Copyright (c) 1997-2003 The PHP Group                                |
   6  // +----------------------------------------------------------------------+
   7  // | This source file is subject to version 2.0 of the PHP license,       |
   8  // | that is bundled with this package in the file LICENSE, and is        |
   9  // | available at through the world-wide-web at                           |
  10  // | http://www.php.net/license/2_02.txt.                                 |
  11  // | If you did not receive a copy of the PHP license and are unable to   |
  12  // | obtain it through the world-wide-web, please send a note to          |
  13  // | license@php.net so we can mail you a copy immediately.               |
  14  // +----------------------------------------------------------------------+
  15  // | Authors: Ulf Wendel <ulf.wendel@phpdoc.de>                           |
  16  // |          Christian Stocker <chregu@phant.ch>                         |
  17  // +----------------------------------------------------------------------+
  18  
  19  require_once  'Cache/Output.php';
  20  
  21  /**
  22  * Cache using Output Buffering and contnet (gz) compression.
  23  ** Usage example:
  24  *
  25  *  // place this somewhere in a central config file
  26  *  define(CACHE_STORAGE_CLASS, 'file');
  27  *  // file storage needs a dir to put the cache files
  28  *  define(CACHE_DIR, '/var/tmp/');
  29  *
  30  *  // get a cache object
  31  *  $cache = new Cache_Output(CACHE_STORAGE_CLASS, array('cache_dir' => CACHE_DIR));
  32  *
  33  *  if (!($content = $cache->start($cache->generateID($REQUEST_URI)))) {
  34  *    print "hello world";
  35  *    $cache->endPrint(+1000);
  36  *  }
  37  *  else {
  38  *    $cache->printContent();
  39  *  }
  40  *
  41  *   OR
  42  *
  43  *  if (($content = $cache->start($cache->generateID($REQUEST_URI)))) {
  44  *    $cache->printContent();
  45  *    die();
  46  *  }
  47  *    print "hello world";
  48  *    $cache->endPrint(+1000);
  49  *
  50  *
  51  * Based upon a case study from Christian Stocker and inspired by jpcache.
  52  *
  53  * @version  $Id: OutputCompression.php,v 1.7 2003/01/04 11:54:45 mj Exp $
  54  * @author   Ulf Wendel <ulf.wendel@phpdoc.de>, Christian Stocker <chregu@phant.ch>
  55  * @access   public
  56  * @package  Cache
  57  */
  58  class Cache_OutputCompression extends Cache_Output {
  59      
  60      /**
  61      * Encoding, what the user (its browser) of your website accepts
  62      * 
  63      * "auto" stands for test using $_SERVER['HTTP_ACCEPT_ENCODING']($HTTP_ACCEPT_ENCODING).
  64      *
  65      * @var  string
  66      * @see  Cache_OutputCompression(), setEncoding()
  67      */
  68      var $encoding = 'auto';
  69   
  70      
  71      /**
  72      * Method used for compression
  73      *
  74      * @var  string
  75      * @see  isCompressed()
  76      */ 
  77      var $compression = '';
  78  
  79      
  80      /**
  81      * Sets the storage details and the content encoding used (if not autodetection)
  82      * 
  83      * @param    string  Name of container class
  84      * @param    array   Array with container class options
  85      * @param    string  content encoding mode - auto => test which encoding the user accepts
  86      */    
  87      function Cache_OutputCompression($container, $container_options = '', $encoding = 'auto') {
  88      
  89          $this->setEncoding($encoding);
  90          $this->Cache($container, $container_options);
  91          
  92      } // end constructor
  93  
  94      
  95      /**
  96      * Call parent deconstructor.
  97      */
  98      function _Cache_OutputCompression() {
  99          $this->_Cache();
 100      } // end deconstructor
 101      
 102  
 103      function generateID($variable) {
 104          
 105          $this->compression = $this->getEncoding();
 106          
 107          return md5(serialize($variable) . serialize($this->compression));
 108      } // end generateID
 109  
 110      
 111      function get($id, $group) {
 112          $this->content = '';
 113          
 114          if (!$this->caching)
 115              return '';
 116          
 117          if ($this->isCached($id, $group) && !$this->isExpired($id, $group))
 118              $this->content = $this->load($id, $group);
 119              
 120          return $this->content;
 121      } // end func get
 122      
 123      
 124      /**
 125      * Stops the output buffering, saves it to the cache and returns the _compressed_ content. 
 126      *
 127      * If you need the uncompressed content for further procession before
 128      * it's saved in the cache use endGet(). endGet() does _not compress_.
 129      */    
 130      function end($expire = 0, $userdata = '') {
 131          $content = ob_get_contents();
 132          ob_end_clean();
 133  
 134          // store in the cache
 135          if ($this->caching) {
 136              $this->extSave($this->output_id, $content, $userdata, $expire, $this->output_group);
 137              return $this->content;                
 138          }
 139              
 140          return $content;        
 141      } // end func end()
 142      
 143      
 144      function endPrint($expire = 0, $userdata = '') {
 145          $this->printContent($this->end($expire, $userdata));
 146      } // end func endPrint
 147  
 148      
 149      /**
 150      * Saves the given data to the cache.
 151      * 
 152      */   
 153      function extSave($id, $cachedata, $userdata, $expires = 0, $group = 'default') {
 154          if (!$this->caching)
 155              return true;
 156  
 157          if ($this->compression) {            
 158              
 159              $len = strlen($cachedata);            
 160              $crc = crc32($cachedata);
 161              $cachedata = gzcompress($cachedata, 9);
 162              $this->content = substr($cachedata, 0, strlen($cachedata) - 4) . pack('V', $crc) . pack('V', $len);
 163              
 164          } else {
 165              
 166              $this->content = $cachedata;
 167              
 168          }
 169          return $this->container->save($id, $this->content, $expires, $group, $userdata);
 170      } // end func extSave
 171      
 172      /**
 173      * Sends the compressed data to the user.
 174      * 
 175      * @param    string
 176      * @access   public
 177      */    
 178      function printContent($content = '') {
 179          $server = &$this->_importGlobalVariable("server");
 180  
 181          if ('' == $content)
 182              $content = &$this->container->cachedata;
 183                   
 184          if ($this->compression && $this->caching) {
 185     
 186              $etag = 'PEAR-Cache-' . md5(substr($content, -40));
 187              header("ETag: $etag");
 188              if (isset($server['HTTP_IF_NONE_MATCH']) && strstr(stripslashes($server['HTTP_IF_NONE_MATCH']), $etag)) {
 189                  // not modified
 190                  header('HTTP/1.0 304');
 191                  return;
 192              } else {
 193     
 194                  // client acceppts some encoding - send headers & data
 195                  header("Content-Encoding: {$this->compression}");
 196                  header('Vary: Accept-Encoding');
 197                  print "\x1f\x8b\x08\x00\x00\x00\x00\x00";
 198              }
 199          
 200          }
 201          
 202          die($content);
 203      } // end func printContent
 204      
 205      
 206      /**
 207      * Returns the encoding method of the current dataset. 
 208      *
 209      * @access   public
 210      * @return   string  Empty string (which evaluates to false) means no compression
 211      */
 212      function isCompressed() {
 213          return $this->compression;
 214      } // end func isCompressed
 215  
 216      /**
 217      * Sets the encoding to be used.
 218      * 
 219      * @param    string  "auto" means autodetect for every client
 220      * @access   public
 221      * @see      $encoding
 222      */
 223      function setEncoding($encoding = 'auto') {
 224          $this->encoding = $encoding;
 225      } // end func setEncoding
 226      
 227      
 228      /**
 229      * Returns the encoding to be used for the data transmission to the client.
 230      *
 231      * @see      setEncoding()
 232      */    
 233      function getEncoding() {
 234          $server = &$this->_importGlobalVariable("server");
 235  
 236          // encoding set by user    
 237          if ('auto' != $this->encoding)
 238              return $this->encoding;
 239          
 240          // check what the client accepts
 241          if (false !== strpos($server['HTTP_ACCEPT_ENCODING'], 'x-gzip'))
 242              return 'x-gzip';
 243          if (false !== strpos($server['HTTP_ACCEPT_ENCODING'], 'gzip'))
 244              return 'gzip';
 245              
 246          // no compression
 247          return '';
 248          
 249      } // end func getEncoding
 250  
 251      // {{{ _importGlobalVariable()
 252  
 253      /**
 254       * Import variables from special namespaces.
 255       *
 256       * @access private
 257       * @param string Type of variable (server, session, post)
 258       * @return array
 259       */
 260      function &_importGlobalVariable($variable) 
 261      {
 262        
 263          $var = null;
 264  
 265          switch (strtolower($variable)) {
 266  
 267              case "server" :
 268                  if (isset($_SERVER)) {
 269                      $var = &$_SERVER;
 270                  } else {
 271                      $var = &$GLOBALS['HTTP_SERVER_VARS'];
 272                  }
 273                  break;
 274  
 275              case "session" :
 276                  if (isset($_SESSION)) {
 277                      $var = &$_SESSION;
 278                  } else {
 279                      $var = &$GLOBALS['HTTP_SESSION_VARS'];
 280                  }
 281                  break;
 282  
 283              case "post" :
 284                  if (isset($_POST)) {
 285                      $var = &$_POST;
 286                  } else {
 287                      $var = &$GLOBALS['HTTP_POST_VARS'];
 288                  }
 289                  break;
 290  
 291              default:
 292                  break;
 293  
 294          }
 295  
 296          return $var;
 297      } 
 298  
 299      // }}
 300  } // end class OutputCompression
 301  ?>


Généré le : Sun Feb 25 14:08:00 2007 par Balluche grâce à PHPXref 0.7