[ Index ]
 

Code source de eZ Publish 3.9.0

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

title

Body

[fermer]

/kernel/classes/ -> ezcontentcache.php (source)

   1  <?php
   2  //
   3  // Definition of eZContentCache class
   4  //
   5  // Created on: <12-Dec-2002 16:53:41 amos>
   6  //
   7  // SOFTWARE NAME: eZ publish
   8  // SOFTWARE RELEASE: 3.9.0
   9  // BUILD VERSION: 17785
  10  // COPYRIGHT NOTICE: Copyright (C) 1999-2006 eZ systems AS
  11  // SOFTWARE LICENSE: GNU General Public License v2.0
  12  // NOTICE: >
  13  //   This program is free software; you can redistribute it and/or
  14  //   modify it under the terms of version 2.0  of the GNU General
  15  //   Public License as published by the Free Software Foundation.
  16  //
  17  //   This program is distributed in the hope that it will be useful,
  18  //   but WITHOUT ANY WARRANTY; without even the implied warranty of
  19  //   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  20  //   GNU General Public License for more details.
  21  //
  22  //   You should have received a copy of version 2.0 of the GNU General
  23  //   Public License along with this program; if not, write to the Free
  24  //   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
  25  //   MA 02110-1301, USA.
  26  //
  27  //
  28  
  29  /*! \file ezcontentcache.php
  30  */
  31  
  32  /*!
  33    \class eZContentCache ezcontentcache.php
  34    \brief The class eZContentCache does
  35  
  36  */
  37  
  38  include_once ( 'lib/ezutils/classes/ezsys.php' );
  39  include_once ( "lib/ezfile/classes/ezdir.php" );
  40  
  41  // The timestamp for the cache format, will expire
  42  // cache which differs from this.
  43  define( 'EZ_CONTENT_CACHE_CODE_DATE', 1064816011 );
  44  
  45  class eZContentCache
  46  {
  47      /*!
  48       Constructor
  49      */
  50      function eZContentCache()
  51      {
  52      }
  53  
  54      function cachePathInfo( $siteDesign, $nodeID, $viewMode, $language, $offset, $roleList, $discountList, $layout, $cacheTTL = false,
  55                              $parameters = array() )
  56      {
  57          $md5Input = array( $nodeID, $viewMode, $language );
  58          $md5Input[] = $offset;
  59          $md5Input = array_merge( $md5Input, $layout );
  60          sort( $roleList );
  61          $md5Input = array_merge( $md5Input, $roleList );
  62          sort( $discountList );
  63          $md5Input = array_merge( $md5Input, $discountList );
  64          if ( $cacheTTL == true )
  65              $md5Input = array_merge( $md5Input, "cache_ttl" );
  66          if ( isset( $parameters['view_parameters'] ) )
  67          {
  68              $viewParameters = $parameters['view_parameters'];
  69              ksort( $viewParameters );
  70              foreach ( $viewParameters as $viewParameterName => $viewParameter )
  71              {
  72                  if ( !$viewParameter )
  73                      continue;
  74                  $md5Input = array_merge( $md5Input, 'vp:' . $viewParameterName . '=' . $viewParameter );
  75              }
  76          }
  77          $md5Text = md5( implode( '-', $md5Input ) );
  78          $cacheFile = $nodeID . '-' . $md5Text . '.cache';
  79          $extraPath = eZDir::filenamePath( "$nodeID" );
  80          $ini =& eZINI::instance();
  81          $currentSiteAccess = $GLOBALS['eZCurrentAccess']['name'];
  82          $cacheDir = eZDir::path( array( eZSys::cacheDirectory(), $ini->variable( 'ContentSettings', 'CacheDir' ), $currentSiteAccess, $extraPath ) );
  83          $cachePath = eZDir::path( array( $cacheDir, $cacheFile ) );
  84          return array( 'dir' => $cacheDir,
  85                        'file' => $cacheFile,
  86                        'path' => $cachePath );
  87      }
  88  
  89      function exists( $siteDesign, $nodeID, $viewMode, $language, $offset, $roleList, $discountList, $layout,
  90                       $parameters = array() )
  91      {
  92          $cachePathInfo = eZContentCache::cachePathInfo( $siteDesign, $nodeID, $viewMode, $language, $offset, $roleList, $discountList,
  93                                                          $layout, false, $parameters );
  94          // VS-DBFILE
  95  
  96          require_once ( 'kernel/classes/ezclusterfilehandler.php' );
  97          $cacheFile = eZClusterFileHandler::instance( $cachePathInfo['path'] );
  98  
  99          if ( $cacheFile->exists() )
 100          {
 101              $timestamp = $cacheFile->mtime();
 102              include_once ( 'kernel/classes/ezcontentobject.php' );
 103              if ( eZContentObject::isCacheExpired( $timestamp ) )
 104              {
 105                  eZDebugSetting::writeDebug( 'kernel-content-view-cache', 'cache expired #1' );
 106                  return false;
 107              }
 108              eZDebugSetting::writeDebug( 'kernel-content-view-cache', "checking viewmode '$viewMode' #1" );
 109              if ( eZContentObject::isComplexViewModeCacheExpired( $viewMode, $timestamp ) )
 110              {
 111                  eZDebugSetting::writeDebug( 'kernel-content-view-cache', "viewmode '$viewMode' cache expired #1" );
 112                  return false;
 113              }
 114  
 115              return true;
 116          }
 117  
 118          eZDebugSetting::writeDebug( 'kernel-content-view-cache', 'cache used #1' );
 119          return false;
 120      }
 121  
 122      function restore( $siteDesign, $nodeID, $viewMode, $language, $offset, $roleList, $discountList, $layout,
 123                        $parameters = array() )
 124      {
 125          $result = array();
 126          $cachePathInfo = eZContentCache::cachePathInfo( $siteDesign, $nodeID, $viewMode, $language, $offset, $roleList, $discountList,
 127                                                          $layout, false, $parameters );
 128          $cacheDir = $cachePathInfo['dir'];
 129          $cacheFile = $cachePathInfo['file'];
 130          $cachePath = $cachePathInfo['path'];
 131          $timestamp = false;
 132  
 133          // VS-DBFILE
 134  
 135          require_once ( 'kernel/classes/ezclusterfilehandler.php' );
 136          $cacheFile = eZClusterFileHandler::instance( $cachePath );
 137  
 138          if ( $cacheFile->exists() )
 139          {
 140              $timestamp = $cacheFile->mtime();
 141              include_once ( 'kernel/classes/ezcontentobject.php' );
 142              if ( eZContentObject::isCacheExpired( $timestamp ) )
 143              {
 144                  eZDebugSetting::writeDebug( 'kernel-content-view-cache', 'cache expired #2' );
 145                  return false;
 146              }
 147              eZDebugSetting::writeDebug( 'kernel-content-view-cache', "checking viewmode '$viewMode' #1" );
 148              if ( eZContentObject::isComplexViewModeCacheExpired( $viewMode, $timestamp ) )
 149              {
 150                  eZDebugSetting::writeDebug( 'kernel-content-view-cache', "viewmode '$viewMode' cache expired #2" );
 151                  return false;
 152              }
 153  
 154          }
 155  
 156          if ( $viewMode == 'pdf' )
 157          {
 158              return $cachePath;
 159          }
 160  
 161          eZDebugSetting::writeDebug( 'kernel-content-view-cache', 'cache used #2' );
 162  
 163          $fileName = $cacheDir . "/" . $cacheFile;
 164  
 165          // VS-DBFILE : FIXME: We may need to cache PDF files locally.
 166  
 167          $cacheFile = eZClusterFileHandler::instance( $fileName );
 168          $contents = $cacheFile->fetchContents();
 169  
 170          $cachedArray = unserialize( $contents );
 171  
 172          $cacheTTL = $cachedArray['cache_ttl'];
 173  
 174          // Check if cache has expired
 175          if ( $cacheTTL > 0 )
 176          {
 177              $expiryTime = $timestamp + $cacheTTL;
 178              if ( time() > $expiryTime )
 179              {
 180                  return false;
 181              }
 182          }
 183  
 184          // Check for template language timestamp
 185          $cacheCodeDate = $cachedArray['cache_code_date'];
 186          if ( $cacheCodeDate != EZ_CONTENT_CACHE_CODE_DATE )
 187              return false;
 188  
 189          $viewMode = $cachedArray['content_info']['viewmode'];
 190  
 191          $res =& eZTemplateDesignResource::instance();
 192          $res->setKeys( array( array( 'node', $nodeID ),
 193                                array( 'view_offset', $offset ),
 194                                array( 'viewmode', $viewMode )
 195                                ) );
 196          $result['content_info'] = $cachedArray['content_info'];
 197          $result['content'] = $cachedArray['content'];
 198  
 199          $result['view_parameters'] = $cachedArray['content_info']['view_parameters'];
 200  
 201          foreach ( array( 'path', 'node_id', 'section_id', 'navigation_part' ) as $item )
 202          {
 203              if ( isset( $cachedArray[$item] ) )
 204              {
 205                  $result[$item] = $cachedArray[$item];
 206              }
 207          }
 208  
 209          // set section id
 210          include_once ( 'kernel/classes/ezsection.php' );
 211          eZSection::setGlobalID( $cachedArray['section_id'] );
 212          return $result;
 213      }
 214  
 215      function store( $siteDesign, $objectID, $classID, $classIdentifier,
 216                      $nodeID, $parentNodeID, $nodeDepth, $urlAlias, $viewMode, $sectionID,
 217                      $language, $offset, $roleList, $discountList, $layout, $navigationPartIdentifier,
 218                      $result, $cacheTTL = -1,
 219                      $parameters = array() )
 220      {
 221          $cachePathInfo = eZContentCache::cachePathInfo( $siteDesign, $nodeID, $viewMode, $language, $offset, $roleList, $discountList,
 222                                                          $layout, false, $parameters );
 223          $cacheDir = $cachePathInfo['dir'];
 224          $cacheFile = $cachePathInfo['file'];
 225  
 226          $serializeArray = array();
 227  
 228          if ( isset( $parameters['view_parameters']['offset'] ) )
 229          {
 230              $offset = $parameters['view_parameters']['offset'];
 231          }
 232          $viewParameters = false;
 233          if ( isset( $parameters['view_parameters'] ) )
 234          {
 235              $viewParameters = $parameters['view_parameters'];
 236          }
 237          $contentInfo = array( 'site_design' => $siteDesign,
 238                                'node_id' => $nodeID,
 239                                'parent_node_id' => $parentNodeID,
 240                                'node_depth' => $nodeDepth,
 241                                'url_alias' => $urlAlias,
 242                                'object_id' => $objectID,
 243                                'class_id' => $classID,
 244                                'class_identifier' => $classIdentifier,
 245                                'navigation_part' => $navigationPartIdentifier,
 246                                'viewmode' => $viewMode,
 247                                'language' => $language,
 248                                'offset' => $offset,
 249                                'view_parameters' => $viewParameters,
 250                                'role_list' => $roleList,
 251                                'discount_list' => $discountList,
 252                                'section_id' => $result['section_id'] );
 253  
 254          $serializeArray['content_info'] = $contentInfo;
 255  
 256          foreach ( array( 'path', 'node_id', 'section_id', 'navigation_part' ) as $item )
 257          {
 258              if ( isset( $result[$item] ) )
 259              {
 260                  $serializeArray[$item] = $result[$item];
 261              }
 262          }
 263  
 264          $serializeArray['cache_ttl'] = $cacheTTL;
 265  
 266          $serializeArray['cache_code_date'] = EZ_CONTENT_CACHE_CODE_DATE;
 267          $serializeArray['content'] = $result['content'];
 268  
 269          $serializeString = serialize( $serializeArray );
 270  
 271          if ( !file_exists( $cacheDir ) )
 272          {
 273              include_once ( 'lib/ezfile/classes/ezdir.php' );
 274              $ini =& eZINI::instance();
 275              $perm = octdec( $ini->variable( 'FileSettings', 'StorageDirPermissions' ) );
 276              eZDir::mkdir( $cacheDir, $perm, true );
 277          }
 278  
 279          $path = $cacheDir . '/' . $cacheFile;
 280          $uniqid = md5( uniqid( 'ezpcache'. getmypid(), true ) );
 281  
 282          // VS-DBFILE : FIXME: Use some kind of one-shot atomic storing here.
 283          //             FIXME: use permissions provided in FileSettings:StorageFilePermissions.
 284  
 285  
 286          require_once ( 'kernel/classes/ezclusterfilehandler.php' );
 287          $file = eZClusterFileHandler::instance( "$cacheDir/$uniqid" );
 288          $file->storeContents( $serializeString, 'viewcache', 'pdf' );
 289          $file->move( $path );
 290  
 291          return true;
 292      }
 293  
 294      function calculateCleanupValue( $nodeCount )
 295      {
 296          return $nodeCount;
 297      }
 298  
 299      function inCleanupThresholdRange( $value )
 300      {
 301          $ini =& eZINI::instance();
 302          $threshold = $ini->variable( 'ContentSettings', 'CacheThreshold' );
 303          return ( $value < $threshold );
 304      }
 305  
 306      function cleanup( $nodeList )
 307      {
 308          // The view-cache has a different storage structure than before:
 309          // var/cache/content/<siteaccess>/<extra-path>/<nodeID>-<hash>.cache
 310          // Also it uses the cluster file handler to delete files using a wildcard (glob style).
 311          $ini =& eZINI::instance();
 312          $cacheBaseDir = eZDir::path( array( eZSys::cacheDirectory(), $ini->variable( 'ContentSettings', 'CacheDir' ) ) );
 313  
 314          require_once ( 'kernel/classes/ezclusterfilehandler.php' );
 315          $fileHandler = eZClusterFileHandler::instance();
 316  
 317          // Figure out the siteaccess which are related, first using the new
 318          // INI setting RelatedSiteAccessList then the old existing one
 319          // AvailableSiteAccessList
 320          if ( $ini->hasVariable( 'SiteAccessSettings', 'RelatedSiteAccessList' ) &&
 321               $relatedSiteAccessList = $ini->variable( 'SiteAccessSettings', 'RelatedSiteAccessList' ) )
 322          {
 323              if ( !is_array( $relatedSiteAccessList ) )
 324              {
 325                  $relatedSiteAccessList = array( $relatedSiteAccessList );
 326              }
 327              $relatedSiteAccessList[] = $GLOBALS['eZCurrentAccess']['name'];
 328              $siteAccesses = array_unique( $relatedSiteAccessList );
 329          }
 330          else
 331          {
 332              $siteAccesses = $ini->variable( 'SiteAccessSettings', 'AvailableSiteAccessList' );
 333          }
 334          if ( !$siteAccesses )
 335          {
 336              return;
 337          }
 338  
 339          foreach ( $nodeList as $nodeID )
 340          {
 341              $extraPath = eZDir::filenamePath( $nodeID );
 342              $fileHandler->fileDeleteByDirList( $siteAccesses, $cacheBaseDir, "$extraPath$nodeID-" );
 343          }
 344      }
 345  }
 346  
 347  ?>


Généré le : Sat Feb 24 10:30:04 2007 par Balluche grâce à PHPXref 0.7