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