[ Index ] |
|
Code source de eZ Publish 3.9.0 |
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 ?>
titre
Description
Corps
titre
Description
Corps
titre
Description
Corps
titre
Corps
Généré le : Sat Feb 24 10:30:04 2007 | par Balluche grâce à PHPXref 0.7 |