diff --git a/_test/tests/inc/cache_use.test.php b/_test/tests/inc/cache_use.test.php index f5349df1396bbe418065c0babe860901c91902d4..c54a472a32098121fe5dcea27a92c70242c30c34 100644 --- a/_test/tests/inc/cache_use.test.php +++ b/_test/tests/inc/cache_use.test.php @@ -10,18 +10,18 @@ class cache_use_test extends DokuWikiTest { private $cache; function setUp() { - global $ID; + global $ID, $conf; parent::setUp(); $ID = 'cached'; $file = wikiFN($ID); + $conf['cachetime'] = 0; // ensure the value is not -1, which disables caching saveWikiText($ID, 'Content', 'Created'); // set the modification time a second in the past in order to ensure that the cache is newer than the page touch($file, time()-1); - # Create cache. Note that the metadata cache is used as the xhtml cache triggers metadata rendering - $this->cache = new cache_renderer($ID, $file, 'metadata'); + $this->cache = new cache_renderer($ID, $file, 'xhtml'); $this->cache->storeCache('Test'); } @@ -29,8 +29,52 @@ class cache_use_test extends DokuWikiTest { $this->assertTrue($this->cache->useCache()); } - + /** + * In all the following tests the cache should not be usable + * as such, they are meaningless if test_use didn't pass. + * + * @depends test_use + */ function test_purge() { - $this->assertFalse($this->cache->useCache(array('purge' => true))); + /* @var Input $INPUT */ + global $INPUT; + $INPUT->set('purge',1); + + $this->assertFalse($this->cache->useCache()); + $this->assertNotEmpty($this->cache->depends['purge']); + } + + /** + * @depends test_use + */ + function test_filedependency() { + // give the dependent src file the same mtime as the cache + touch($this->cache->file, filemtime($this->cache->cache)); + $this->assertFalse($this->cache->useCache()); + } + + /** + * @depends test_use + */ + function test_age() { + // need to age both our source file & the cache + $age = 10; + $time = time() - $age - 1; // older than age + + touch($this->cache->file, $time - 1); + touch($this->cache->cache, $time); + + $this->assertFalse($this->cache->useCache(array('age' => $age))); + } + + /** + * @depends test_use + */ + function test_confnocaching() { + global $conf; + $conf['cachetime'] = -1; // disables renderer caching + + $this->assertFalse($this->cache->useCache()); + $this->assertNotEmpty($this->cache->_nocache); } } \ No newline at end of file diff --git a/inc/cache.php b/inc/cache.php index 56c5b65f26760b884eb05f4560a0755923f807f3..7a66049f43927093a0ca0a0a73f861d680a13268 100644 --- a/inc/cache.php +++ b/inc/cache.php @@ -16,10 +16,11 @@ class cache { public $ext = ''; // file ext for cache data, secondary identifier for this item public $cache = ''; // cache file name public $depends = array(); // array containing cache dependency information, - // used by _useCache to determine cache validity + // used by _useCache to determine cache validity var $_event = ''; // event to be triggered during useCache var $_time; + var $_nocache = false; // if set to true, cache will not be used or stored /** * @param string $key primary identifier @@ -34,7 +35,7 @@ class cache { /** * public method to determine whether the cache can be used * - * to assist in cetralisation of event triggering and calculation of cache statistics, + * to assist in centralisation of event triggering and calculation of cache statistics, * don't override this function override _useCache() * * @param array $depends array of cache dependencies, support dependecies: @@ -71,6 +72,7 @@ class cache { */ public function _useCache() { + if ($this->_nocache) return false; // caching turned off if (!empty($this->depends['purge'])) return false; // purge requested? if (!($this->_time = @filemtime($this->cache))) return false; // cache exists? @@ -115,6 +117,8 @@ class cache { * @return bool true on success, false otherwise */ public function storeCache($data) { + if ($this->_nocache) return false; + return io_savefile($this->cache, $data); } @@ -203,10 +207,6 @@ class cache_parser extends cache { } protected function _addDependencies() { - global $conf; - - $this->depends['age'] = isset($this->depends['age']) ? - min($this->depends['age'],$conf['cachetime']) : $conf['cachetime']; // parser cache file dependencies ... $files = array($this->file, // ... source @@ -265,6 +265,18 @@ class cache_renderer extends cache_parser { } protected function _addDependencies() { + global $conf; + + // default renderer cache file 'age' is dependent on 'cachetime' setting, two special values: + // -1 : do not cache (should not be overridden) + // 0 : cache never expires (can be overridden) - no need to set depends['age'] + if ($conf['cachetime'] == -1) { + $this->_nocache = true; + return; + } elseif ($conf['cachetime'] > 0) { + $this->depends['age'] = isset($this->depends['age']) ? + min($this->depends['age'],$conf['cachetime']) : $conf['cachetime']; + } // renderer cache file dependencies ... $files = array( @@ -317,6 +329,8 @@ class cache_instructions extends cache_parser { * @return bool true on success, false otherwise */ public function storeCache($instructions) { + if ($this->_nocache) return false; + return io_savefile($this->cache,serialize($instructions)); } } diff --git a/inc/parserutils.php b/inc/parserutils.php index 8244837e1e972d44be81b592e99707494432555b..9c2a0b570fe4886c47dea60c6bc55c8f472b3eec 100644 --- a/inc/parserutils.php +++ b/inc/parserutils.php @@ -112,8 +112,7 @@ function p_cached_output($file, $format='xhtml', $id='') { } else { $parsed = p_render($format, p_cached_instructions($file,false,$id), $info); - if ($info['cache']) { - $cache->storeCache($parsed); //save cachefile + if ($info['cache'] && $cache->storeCache($parsed)) { // storeCache() attempts to save cachefile if($conf['allowdebug'] && $format=='xhtml') $parsed .= "\n<!-- no cachefile used, but created {$cache->cache} -->\n"; }else{ $cache->removeCache(); //try to delete cachefile