1*0db5771eSMichael Große<?php 2*0db5771eSMichael Große 3*0db5771eSMichael Großenamespace dokuwiki\Cache; 4*0db5771eSMichael Große 5*0db5771eSMichael Große/** 6*0db5771eSMichael Große * Caching of data of renderer 7*0db5771eSMichael Große */ 8*0db5771eSMichael Großeclass CacheRenderer extends CacheParser 9*0db5771eSMichael Große{ 10*0db5771eSMichael Große 11*0db5771eSMichael Große /** 12*0db5771eSMichael Große * method contains cache use decision logic 13*0db5771eSMichael Große * 14*0db5771eSMichael Große * @return bool see useCache() 15*0db5771eSMichael Große */ 16*0db5771eSMichael Große public function _useCache() 17*0db5771eSMichael Große { 18*0db5771eSMichael Große global $conf; 19*0db5771eSMichael Große 20*0db5771eSMichael Große if (!parent::_useCache()) { 21*0db5771eSMichael Große return false; 22*0db5771eSMichael Große } 23*0db5771eSMichael Große 24*0db5771eSMichael Große if (!isset($this->page)) { 25*0db5771eSMichael Große return true; 26*0db5771eSMichael Große } 27*0db5771eSMichael Große 28*0db5771eSMichael Große // meta cache older than file it depends on? 29*0db5771eSMichael Große if ($this->_time < @filemtime(metaFN($this->page, '.meta'))) { 30*0db5771eSMichael Große return false; 31*0db5771eSMichael Große } 32*0db5771eSMichael Große 33*0db5771eSMichael Große // check current link existence is consistent with cache version 34*0db5771eSMichael Große // first check the purgefile 35*0db5771eSMichael Große // - if the cache is more recent than the purgefile we know no links can have been updated 36*0db5771eSMichael Große if ($this->_time >= @filemtime($conf['cachedir'] . '/purgefile')) { 37*0db5771eSMichael Große return true; 38*0db5771eSMichael Große } 39*0db5771eSMichael Große 40*0db5771eSMichael Große // for wiki pages, check metadata dependencies 41*0db5771eSMichael Große $metadata = p_get_metadata($this->page); 42*0db5771eSMichael Große 43*0db5771eSMichael Große if (!isset($metadata['relation']['references']) || 44*0db5771eSMichael Große empty($metadata['relation']['references'])) { 45*0db5771eSMichael Große return true; 46*0db5771eSMichael Große } 47*0db5771eSMichael Große 48*0db5771eSMichael Große foreach ($metadata['relation']['references'] as $id => $exists) { 49*0db5771eSMichael Große if ($exists != page_exists($id, '', false)) { 50*0db5771eSMichael Große return false; 51*0db5771eSMichael Große } 52*0db5771eSMichael Große } 53*0db5771eSMichael Große 54*0db5771eSMichael Große return true; 55*0db5771eSMichael Große } 56*0db5771eSMichael Große 57*0db5771eSMichael Große protected function _addDependencies() 58*0db5771eSMichael Große { 59*0db5771eSMichael Große global $conf; 60*0db5771eSMichael Große 61*0db5771eSMichael Große // default renderer cache file 'age' is dependent on 'cachetime' setting, two special values: 62*0db5771eSMichael Große // -1 : do not cache (should not be overridden) 63*0db5771eSMichael Große // 0 : cache never expires (can be overridden) - no need to set depends['age'] 64*0db5771eSMichael Große if ($conf['cachetime'] == -1) { 65*0db5771eSMichael Große $this->_nocache = true; 66*0db5771eSMichael Große return; 67*0db5771eSMichael Große } elseif ($conf['cachetime'] > 0) { 68*0db5771eSMichael Große $this->depends['age'] = isset($this->depends['age']) ? 69*0db5771eSMichael Große min($this->depends['age'], $conf['cachetime']) : $conf['cachetime']; 70*0db5771eSMichael Große } 71*0db5771eSMichael Große 72*0db5771eSMichael Große // renderer cache file dependencies ... 73*0db5771eSMichael Große $files = array( 74*0db5771eSMichael Große DOKU_INC . 'inc/parser/' . $this->mode . '.php', // ... the renderer 75*0db5771eSMichael Große ); 76*0db5771eSMichael Große 77*0db5771eSMichael Große // page implies metadata and possibly some other dependencies 78*0db5771eSMichael Große if (isset($this->page)) { 79*0db5771eSMichael Große 80*0db5771eSMichael Große // for xhtml this will render the metadata if needed 81*0db5771eSMichael Große $valid = p_get_metadata($this->page, 'date valid'); 82*0db5771eSMichael Große if (!empty($valid['age'])) { 83*0db5771eSMichael Große $this->depends['age'] = isset($this->depends['age']) ? 84*0db5771eSMichael Große min($this->depends['age'], $valid['age']) : $valid['age']; 85*0db5771eSMichael Große } 86*0db5771eSMichael Große } 87*0db5771eSMichael Große 88*0db5771eSMichael Große $this->depends['files'] = !empty($this->depends['files']) ? 89*0db5771eSMichael Große array_merge($files, $this->depends['files']) : 90*0db5771eSMichael Große $files; 91*0db5771eSMichael Große 92*0db5771eSMichael Große parent::_addDependencies(); 93*0db5771eSMichael Große } 94*0db5771eSMichael Große} 95