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 * method contains cache use decision logic 120db5771eSMichael Große * 130db5771eSMichael Große * @return bool see useCache() 140db5771eSMichael Große */ 1572c2bae8SMichael Große public function makeDefaultCacheDecision() 160db5771eSMichael Große { 170db5771eSMichael Große global $conf; 180db5771eSMichael Große 1972c2bae8SMichael Große if (!parent::makeDefaultCacheDecision()) { 200db5771eSMichael Große return false; 210db5771eSMichael Große } 220db5771eSMichael Große 230db5771eSMichael Große if (!isset($this->page)) { 240db5771eSMichael Große return true; 250db5771eSMichael Große } 260db5771eSMichael Große 270db5771eSMichael Große // meta cache older than file it depends on? 28b4b0b31bSMichael Große if ($this->_time < @filemtime(metaFN($this->page, '.meta'))) { 290db5771eSMichael Große return false; 300db5771eSMichael Große } 310db5771eSMichael Große 320db5771eSMichael Große // check current link existence is consistent with cache version 330db5771eSMichael Große // first check the purgefile 340db5771eSMichael Große // - if the cache is more recent than the purgefile we know no links can have been updated 35b4b0b31bSMichael Große if ($this->_time >= @filemtime($conf['cachedir'] . '/purgefile')) { 360db5771eSMichael Große return true; 370db5771eSMichael Große } 380db5771eSMichael Große 390db5771eSMichael Große // for wiki pages, check metadata dependencies 400db5771eSMichael Große $metadata = p_get_metadata($this->page); 410db5771eSMichael Große 42*7d34963bSAndreas Gohr if ( 43*7d34963bSAndreas Gohr !isset($metadata['relation']['references']) || 44*7d34963bSAndreas Gohr empty($metadata['relation']['references']) 45*7d34963bSAndreas Gohr ) { 460db5771eSMichael Große return true; 470db5771eSMichael Große } 480db5771eSMichael Große 490db5771eSMichael Große foreach ($metadata['relation']['references'] as $id => $exists) { 500db5771eSMichael Große if ($exists != page_exists($id, '', false)) { 510db5771eSMichael Große return false; 520db5771eSMichael Große } 530db5771eSMichael Große } 540db5771eSMichael Große 550db5771eSMichael Große return true; 560db5771eSMichael Große } 570db5771eSMichael Große 5842c00b45SMichael Große protected function addDependencies() 590db5771eSMichael Große { 600db5771eSMichael Große global $conf; 610db5771eSMichael Große 620db5771eSMichael Große // default renderer cache file 'age' is dependent on 'cachetime' setting, two special values: 630db5771eSMichael Große // -1 : do not cache (should not be overridden) 640db5771eSMichael Große // 0 : cache never expires (can be overridden) - no need to set depends['age'] 650db5771eSMichael Große if ($conf['cachetime'] == -1) { 66b4b0b31bSMichael Große $this->_nocache = true; 670db5771eSMichael Große return; 680db5771eSMichael Große } elseif ($conf['cachetime'] > 0) { 690db5771eSMichael Große $this->depends['age'] = isset($this->depends['age']) ? 700db5771eSMichael Große min($this->depends['age'], $conf['cachetime']) : $conf['cachetime']; 710db5771eSMichael Große } 720db5771eSMichael Große 730db5771eSMichael Große // renderer cache file dependencies ... 74a95427a5SAndreas Gohr $files = [DOKU_INC . 'inc/parser/' . $this->mode . '.php']; 750db5771eSMichael Große 760db5771eSMichael Große // page implies metadata and possibly some other dependencies 770db5771eSMichael Große if (isset($this->page)) { 780db5771eSMichael Große // for xhtml this will render the metadata if needed 790db5771eSMichael Große $valid = p_get_metadata($this->page, 'date valid'); 800db5771eSMichael Große if (!empty($valid['age'])) { 810db5771eSMichael Große $this->depends['age'] = isset($this->depends['age']) ? 820db5771eSMichael Große min($this->depends['age'], $valid['age']) : $valid['age']; 830db5771eSMichael Große } 840db5771eSMichael Große } 850db5771eSMichael Große 86a95427a5SAndreas Gohr $this->depends['files'] = empty($this->depends['files']) ? 87a95427a5SAndreas Gohr $files : 88a95427a5SAndreas Gohr array_merge($files, $this->depends['files']); 890db5771eSMichael Große 9042c00b45SMichael Große parent::addDependencies(); 910db5771eSMichael Große } 920db5771eSMichael Große} 93