10db5771eSMichael Große<?php 20db5771eSMichael Große 30db5771eSMichael Großenamespace dokuwiki\Cache; 40db5771eSMichael Große 50db5771eSMichael Große/** 60db5771eSMichael Große * Caching of data of renderer 70db5771eSMichael Große */ 80db5771eSMichael Großeclass CacheRenderer extends CacheParser 90db5771eSMichael Große{ 100db5771eSMichael Große 110db5771eSMichael Große /** 120db5771eSMichael Große * method contains cache use decision logic 130db5771eSMichael Große * 140db5771eSMichael Große * @return bool see useCache() 150db5771eSMichael Große */ 16*42c00b45SMichael Große public function makdeDefaultCacheDecision() 170db5771eSMichael Große { 180db5771eSMichael Große global $conf; 190db5771eSMichael Große 20*42c00b45SMichael Große if (!parent::makdeDefaultCacheDecision()) { 210db5771eSMichael Große return false; 220db5771eSMichael Große } 230db5771eSMichael Große 240db5771eSMichael Große if (!isset($this->page)) { 250db5771eSMichael Große return true; 260db5771eSMichael Große } 270db5771eSMichael Große 280db5771eSMichael Große // meta cache older than file it depends on? 290db5771eSMichael Große if ($this->_time < @filemtime(metaFN($this->page, '.meta'))) { 300db5771eSMichael Große return false; 310db5771eSMichael Große } 320db5771eSMichael Große 330db5771eSMichael Große // check current link existence is consistent with cache version 340db5771eSMichael Große // first check the purgefile 350db5771eSMichael Große // - if the cache is more recent than the purgefile we know no links can have been updated 360db5771eSMichael Große if ($this->_time >= @filemtime($conf['cachedir'] . '/purgefile')) { 370db5771eSMichael Große return true; 380db5771eSMichael Große } 390db5771eSMichael Große 400db5771eSMichael Große // for wiki pages, check metadata dependencies 410db5771eSMichael Große $metadata = p_get_metadata($this->page); 420db5771eSMichael Große 430db5771eSMichael Große if (!isset($metadata['relation']['references']) || 440db5771eSMichael Große empty($metadata['relation']['references'])) { 450db5771eSMichael Große return true; 460db5771eSMichael Große } 470db5771eSMichael Große 480db5771eSMichael Große foreach ($metadata['relation']['references'] as $id => $exists) { 490db5771eSMichael Große if ($exists != page_exists($id, '', false)) { 500db5771eSMichael Große return false; 510db5771eSMichael Große } 520db5771eSMichael Große } 530db5771eSMichael Große 540db5771eSMichael Große return true; 550db5771eSMichael Große } 560db5771eSMichael Große 57*42c00b45SMichael Große protected function addDependencies() 580db5771eSMichael Große { 590db5771eSMichael Große global $conf; 600db5771eSMichael Große 610db5771eSMichael Große // default renderer cache file 'age' is dependent on 'cachetime' setting, two special values: 620db5771eSMichael Große // -1 : do not cache (should not be overridden) 630db5771eSMichael Große // 0 : cache never expires (can be overridden) - no need to set depends['age'] 640db5771eSMichael Große if ($conf['cachetime'] == -1) { 650db5771eSMichael Große $this->_nocache = true; 660db5771eSMichael Große return; 670db5771eSMichael Große } elseif ($conf['cachetime'] > 0) { 680db5771eSMichael Große $this->depends['age'] = isset($this->depends['age']) ? 690db5771eSMichael Große min($this->depends['age'], $conf['cachetime']) : $conf['cachetime']; 700db5771eSMichael Große } 710db5771eSMichael Große 720db5771eSMichael Große // renderer cache file dependencies ... 730db5771eSMichael Große $files = array( 740db5771eSMichael Große DOKU_INC . 'inc/parser/' . $this->mode . '.php', // ... the renderer 750db5771eSMichael Große ); 760db5771eSMichael Große 770db5771eSMichael Große // page implies metadata and possibly some other dependencies 780db5771eSMichael Große if (isset($this->page)) { 790db5771eSMichael Große 800db5771eSMichael Große // for xhtml this will render the metadata if needed 810db5771eSMichael Große $valid = p_get_metadata($this->page, 'date valid'); 820db5771eSMichael Große if (!empty($valid['age'])) { 830db5771eSMichael Große $this->depends['age'] = isset($this->depends['age']) ? 840db5771eSMichael Große min($this->depends['age'], $valid['age']) : $valid['age']; 850db5771eSMichael Große } 860db5771eSMichael Große } 870db5771eSMichael Große 880db5771eSMichael Große $this->depends['files'] = !empty($this->depends['files']) ? 890db5771eSMichael Große array_merge($files, $this->depends['files']) : 900db5771eSMichael Große $files; 910db5771eSMichael Große 92*42c00b45SMichael Große parent::addDependencies(); 930db5771eSMichael Große } 940db5771eSMichael Große} 95