xref: /dokuwiki/inc/Cache/CacheRenderer.php (revision a95427a565a82aca45ae276c0f1d330606f6f9b4)
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     */
1672c2bae8SMichael Große    public function makeDefaultCacheDecision()
170db5771eSMichael Große    {
180db5771eSMichael Große        global $conf;
190db5771eSMichael Große
2072c2bae8SMichael Große        if (!parent::makeDefaultCacheDecision()) {
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?
29b4b0b31bSMichael 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
36b4b0b31bSMichael 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
5742c00b45SMichael 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) {
65b4b0b31bSMichael 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 ...
73*a95427a5SAndreas Gohr        $files = [DOKU_INC . 'inc/parser/' . $this->mode . '.php'];
740db5771eSMichael Große
750db5771eSMichael Große        // page implies metadata and possibly some other dependencies
760db5771eSMichael Große        if (isset($this->page)) {
770db5771eSMichael Große
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
86*a95427a5SAndreas Gohr        $this->depends['files'] = empty($this->depends['files']) ?
87*a95427a5SAndreas Gohr            $files :
88*a95427a5SAndreas Gohr            array_merge($files, $this->depends['files']);
890db5771eSMichael Große
9042c00b45SMichael Große        parent::addDependencies();
910db5771eSMichael Große    }
920db5771eSMichael Große}
93