From 249af9b67343a73df780d95982ccc32d81e564ab Mon Sep 17 00:00:00 2001 From: =?utf8?q?Roland=20H=C3=A4der?= Date: Fri, 5 Dec 2008 23:47:16 +0000 Subject: [PATCH] Cache system rewritten, thanks to profi-concept's hints of including not evaluating it --- inc/databases.php | 2 +- inc/libs/cache_functions.php | 125 ++++++++++++++++---------------- inc/loader/load_cache-admin.php | 7 +- 3 files changed, 70 insertions(+), 64 deletions(-) diff --git a/inc/databases.php b/inc/databases.php index 3e793e79ac..04b81d6fd0 100644 --- a/inc/databases.php +++ b/inc/databases.php @@ -114,7 +114,7 @@ define('USAGE_BASE', "usage"); define('SERVER_URL', "http://www.mxchange.org"); // Current SVN revision -define('CURR_SVN_REVISION', "601"); +define('CURR_SVN_REVISION', "602"); // Take a prime number which is long (if you know a longer one please try it out!) define('_PRIME', 591623); diff --git a/inc/libs/cache_functions.php b/inc/libs/cache_functions.php index 88b506223d..d5b3639477 100644 --- a/inc/libs/cache_functions.php +++ b/inc/libs/cache_functions.php @@ -65,10 +65,10 @@ class mxchange_cache // Check if path exists if ((is_dir($path)) && (!$tested)) { // Check if we can create a file inside the path - @touch($path."dummy.tmp", 'w'); + touch($path."dummy.tmp", 'w'); if (FILE_READABLE($path."dummy.tmp")) { // Yes, we can do. So let's remove it - @unlink($path."dummy.tmp"); + unlink($path."dummy.tmp"); // Is there a .htaccess file? if (FILE_READABLE($path.".htaccess")) { @@ -116,7 +116,10 @@ class mxchange_cache if (($status) && ((time() - $ctime) >= $this->update_interval)) { // Ok, we need an update! $status = false; - } // END - if + } elseif ($status) { + // Check on 'cache' extension + $status = $this->ext_version_matches("cache"); + } // Return status return $status; @@ -126,14 +129,14 @@ class mxchange_cache // This will destory an existing cache file! if ($this->ret == "done") { // Create file - if (FILE_READABLE($this->cache_inc)) @chmod($this->cache_inc, 0666); - $fp = @fopen($this->cache_inc, 'w') or mxchange_die("Cannot write to cache ".$this->cache_inc." !"); + if (FILE_READABLE($this->cache_inc)) chmod($this->cache_inc, 0666); + $this->cache_pointer = fopen($this->cache_inc, 'w') or mxchange_die("Cannot write to cache ".$this->cache_inc." !"); // Begin of cache file - fwrite($fp, "\$ARRAY = \"".$array."\";\n\n"); + fwrite($this->cache_pointer, "cache_pointer = $fp; + // Add default depency + $this->store_extension_version("cache"); } else { // Cannot create file ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); @@ -162,7 +165,7 @@ class mxchange_cache } // Write cache line to file - @fwrite($this->cache_pointer, $this->add_raw_row($k, $v)); + fwrite($this->cache_pointer, $this->add_raw_row($k, $v)); } } else { // Cannot create file @@ -170,29 +173,34 @@ class mxchange_cache } } - function cache_close() - { + function cache_close() { // Quit function when no pointer is set if (empty($this->cache_pointer)) return; - if ($this->cache_pointer) - { + if (is_resource($this->cache_pointer)) { + // Write footer + fwrite($this->cache_pointer, "?>\n"); + // Close file add destroy handler - @fclose($this->cache_pointer); + fclose($this->cache_pointer); // Set rights - if (FILE_READABLE($this->cache_inc)) @chmod($this->cache_inc, 0666); + if (FILE_READABLE($this->cache_inc)) chmod($this->cache_inc, 0666); // Remove pointer unset($this->cache_pointer); - } - else - { + } else { // Cannot create file ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); } } function cache_load() { + // Is the cache already loaded? + if (isset($this->cache_data[$this->cache_file])) { + // Return it's content! + return $this->cache_data[$this->cache_file]; + } // END - if + // Is the cache file there? if (FILE_READABLE($this->cache_inc)) { // Prepare temporary array @@ -200,11 +208,9 @@ class mxchange_cache $cache_version = null; // Load cache file - $this->cache_data[$this->cache_file] = implode("", file($this->cache_inc)); - - // Execute cache file - eval($this->cache_data[$this->cache_file]); + require_once($this->cache_inc); + // Is there an array? if (is_array($data)) { // Cache data $this->cache_data[$this->cache_file] = $data; @@ -238,7 +244,7 @@ class mxchange_cache // Is the cache file there? if (FILE_READABLE($this->cache_inc)) { // Remove cache file from system - @unlink($this->cache_inc); + unlink($this->cache_inc); if (!FILE_READABLE($this->cache_inc)) { // Close cache automatically (we don't need it anymore!) $this->cache_close(); @@ -268,27 +274,13 @@ class mxchange_cache } // Flush array to cache file - $fp = fopen($this->cache_inc, 'w'); - fwrite($fp, "\$ARRAY = \"".$ARRAY."\";\n"); - foreach ($dummy as $k => $v) { - if (is_array($v)) { - // Multi line(s) found - $LINE = ""; - foreach($v as $k2 => $v2) { - // Put every array element in a row... - $LINE .= $this->add_raw_row($k, $v2); - } - } else { - // Single line found - $LINE = $this->add_raw_row($k, $v); - } + $this->cache_init($ARRAY); - // Write line(s) - fwrite($fp, $LINE); - } + // Write array out + $this->cache_write_array($dummy); // Close cache file - fclose($fp); + $this->cache_close(); } } else { // Cannot write to cache! @@ -296,10 +288,33 @@ class mxchange_cache } } + function cache_write_array ($array) { + if (is_resource($this->cache_pointer)) { + foreach ($array as $k => $v) { + if (is_array($v)) { + // Multi line(s) found + $LINE = ""; + foreach($v as $k2 => $v2) { + // Put every array element in a row... + $LINE .= $this->add_raw_row($k, $v2); + } + } else { + // Single line found + $LINE = $this->add_raw_row($k, $v); + } + + // Write line(s) + fwrite($this->cache_pointer, $LINE); + } // END - foreach + } else { + // Cannot write array! + ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); + } + } + function cache_replace($search, $replace, $search_key, $array) { global $ARRAY; - if ((FILE_READABLE($this->cache_inc)) && (is_writeable($this->cache_inc))) - { + if ((FILE_READABLE($this->cache_inc)) && (is_writeable($this->cache_inc))) { // Load cache into dummy array $dummy = $this->cache_load(); @@ -319,27 +334,13 @@ class mxchange_cache } // Flush array to cache file - $fp = fopen($this->cache_inc, 'w'); - fwrite($fp, "\$dummy = \"".$ARRAY."\";\n"); - foreach ($dummy as $k => $v) { - if (is_array($v)) { - // Multi line(s) found - $LINE = ""; - foreach($v as $k2 => $v2) { - // Put every array element in a row... - $LINE .= $this->add_raw_row($k, $v2); - } - } else { - // Single line found - $LINE = $this->add_raw_row($k, $v); - } + $this->cache_init($ARRAY); - // Write line(s) - fwrite($fp, $LINE); - } + // Write array out + $this->cache_write_array($dummy); // Close cache file - fclose($fp); + $this->cache_close(); } } } else { @@ -355,7 +356,7 @@ class mxchange_cache $ext_ver = GET_EXT_VERSION($ext_name); // Write cache line to file - @fwrite($this->cache_pointer, "\$cache_version['".$ext_name."'] = \"".$ext_ver."\";\n"); + fwrite($this->cache_pointer, "\$cache_version['".$ext_name."'] = \"".$ext_ver."\";\n"); } else { // Cannot create file ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); diff --git a/inc/loader/load_cache-admin.php b/inc/loader/load_cache-admin.php index 7e28bda282..e29f3e2bfd 100644 --- a/inc/loader/load_cache-admin.php +++ b/inc/loader/load_cache-admin.php @@ -44,7 +44,7 @@ if (($cacheInstance->cache_file("admins")) && ($cacheInstance->ext_version_match $cacheArray['admins'] = $cacheInstance->cache_load(); // Check if valid - if ((is_array($cacheArray['admins']['login'])) && (is_array($cacheArray['admins']['aid']))) { + if ((isset($cacheArray['admins']['login'])) && (is_array($cacheArray['admins']['login'])) && (is_array($cacheArray['admins']['aid']))) { // Check count if (count($cacheArray['admins']['login']) == count($cacheArray['admins']['aid'])) { // Get "id map" @@ -127,6 +127,8 @@ if (GET_EXT_VERSION("admins") >= "0.3") { // Load all modules and their data $result = SQL_QUERY("SELECT id, admin_id, action_menu, what_menu, access_mode FROM "._MYSQL_PREFIX."_admins_acls ORDER BY admin_id, action_menu, what_menu", __FILE__, __LINE__); + + // Add all rows while ($data = SQL_FETCHARRAY($result)) { // Add row to cache file $cacheInstance->add_row($data); @@ -135,6 +137,9 @@ if (GET_EXT_VERSION("admins") >= "0.3") { // Free memory SQL_FREERESULT($result); + // Close cache + $cacheInstance->cache_close(); + // Reload the cache require(__FILE__); } -- 2.39.5