xref: /dokuwiki/inc/Cache/CacheRenderer.php (revision d4f83172d9533c4d84f450fe22ef630816b21d75)
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