clear_cache() and content_cache
[email protected] (Nichlas Löfdahl) Wed, 22 Jun 2005 20:30:50 +0200
| Newsgroups | php.smarty.dev |
|---|---|
| Message-ID | <[email protected]> |
Greetings! There's a small bug with caching in smarty. If you do the following: 1. Checks the cache with $smarty->is_cached($template) 2. You find out that the cache should be cleared because the timestamp of the cachefile is older than some recently changed data. 3 Clears cache with $smarty->clear_cache($template); 4. Assign the new data and regenerate cache with $smarty->display($template). 5. Smarty shows the old, cached template instead. <--- BUG Right now smarty temporarily stores cache-content in a static variable inside smarty_core_read_cache_file() and it is not cleared when you call $smarty->clear_cache. I've attached a patch which transforms the static variable in smarty_core_read_cache_file() to a memberfunction of the Smarty-class instead. This way clear_cache can correctly reset the state of the cache-content. /Nichlas
Smarty.class.php.patch
(text/plain, 1.2 KB)
Index: Smarty.class.php
===================================================================
RCS file: /repository/smarty/libs/Smarty.class.php,v
retrieving revision 1.515
diff -u -r1.515 Smarty.class.php
--- Smarty.class.php 31 Mar 2005 14:57:18 -0000 1.515
+++ Smarty.class.php 22 Jun 2005 18:28:37 -0000
@@ -502,6 +502,13 @@
var $_cache_info = array();
/**
+ * contains recently fetched cache-content
+ *
+ * @var array
+ */
+ var $_content_cache = array();
+
+ /**
* default file permissions
*
* @var integer
@@ -958,6 +965,8 @@
return smarty_core_rm_auto($_params, $this);
}
+ $hash = $tpl_file.','.$cache_id.','.$compile_id;
+ if(isset($smarty->_content_cache[$hash])) unset($smarty->_content_cache[$hash]);
}
@@ -1112,7 +1121,7 @@
function fetch($resource_name, $cache_id = null, $compile_id = null, $display = false)
{
static $_cache_info = array();
-
+
$_smarty_old_error_level = $this->debugging ? error_reporting() : error_reporting(isset($this->error_reporting)
? $this->error_reporting : error_reporting() & ~E_NOTICE);
core.read_cache_file.php.patch
(text/plain, 1.8 KB)
Index: core.read_cache_file.php
===================================================================
RCS file: /repository/smarty/libs/internals/core.read_cache_file.php,v
retrieving revision 1.2
diff -u -r1.2 core.read_cache_file.php
--- core.read_cache_file.php 1 Feb 2005 10:19:08 -0000 1.2
+++ core.read_cache_file.php 22 Jun 2005 18:26:15 -0000
@@ -20,15 +20,16 @@
function smarty_core_read_cache_file(&$params, &$smarty)
{
- static $content_cache = array();
-
if ($smarty->force_compile) {
// force compile enabled, always regenerate
return false;
}
- if (isset($content_cache[$params['tpl_file'].','.$params['cache_id'].','.$params['compile_id']])) {
- list($params['results'], $smarty->_cache_info) = $content_cache[$params['tpl_file'].','.$params['cache_id'].','.$params['compile_id']];
+ $hash = $params['tpl_file'].','.$params['cache_id'].','.$params['compile_id'];
+
+ if (isset($smart->_content_cache[$hash])) {
+
+ list($params['results'], $smarty->_cache_info) = $smarty->_content_cache[$hash];
return true;
}
@@ -36,6 +37,7 @@
// use cache_handler function
call_user_func_array($smarty->cache_handler_func,
array('read', &$smarty, &$params['results'], $params['tpl_file'], $params['cache_id'], $params['compile_id'], null));
+
} else {
// use local cache file
$_auto_id = $smarty->_get_auto_id($params['cache_id'], $params['compile_id']);
@@ -100,7 +102,7 @@
return false;
}
}
- $content_cache[$params['tpl_file'].','.$params['cache_id'].','.$params['compile_id']] = array($params['results'], $_cache_info);
+ $smarty->_content_cache[$hash] = array($params['results'], $_cache_info);
$smarty->_cache_info = $_cache_info;
return true;