X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;ds=sidebyside;f=inc%2Flibs%2Fcache_functions.php;h=d5b3639477adb24ff08b65b35794b764c33a3bc3;hb=249af9b67343a73df780d95982ccc32d81e564ab;hp=f3496a5ccb4f152aed76f2fac9e2d2c510583ad8;hpb=4db052cce49f60b6d9cc0f1c06b95cdd99f904ad;p=mailer.git diff --git a/inc/libs/cache_functions.php b/inc/libs/cache_functions.php index f3496a5ccb..d5b3639477 100644 --- a/inc/libs/cache_functions.php +++ b/inc/libs/cache_functions.php @@ -32,11 +32,11 @@ ************************************************************************/ // Some security stuff... -if (ereg(basename(__FILE__), $_SERVER['PHP_SELF'])) -{ +if (!defined('__SECURITY')) { $INC = substr(dirname(__FILE__), 0, strpos(dirname(__FILE__), "/inc") + 4) . "/security.php"; require($INC); } + // Caching class class mxchange_cache { @@ -49,22 +49,26 @@ class mxchange_cache var $cache_pointer = false; var $cache_data = ""; var $cache_version = ""; + var $cache_file = ""; // Constructor function mxchange_cache($interval, $path, $tested) { + // Failed is the default + $this->ret = "failed"; + // Remember interval in class - $this->update_interval=$interval; + $this->update_interval = $interval; // Remeber path - $this->cache_path=$path; + $this->cache_path = $path; // 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")) { @@ -72,26 +76,23 @@ class mxchange_cache UPDATE_CONFIG("cache_tested", 1); // All done! - return "done"; + $this->ret = "done"; } else { // Stop! Set a .htaccess file first - $this->ret="htaccess"; - return "htaccess"; + $this->ret = "htaccess"; } } } elseif ($tested) { // System already tested - $this->ret="done"; - return "done"; + $this->ret = "done"; } - - // Something goes wrong here! - $this->ret="failed"; - return "failed"; } - function cache_file($file, $ignore_ctime=false) { - global $INC; + // Checks validity of cache file and if content is given + function cache_file ($file, $forceContent = false) { + // Remember cache file + $this->cache_file = $file; + // Construct FQFN (full qualified file name) $inc = $this->cache_path.$file.".cache"; @@ -112,9 +113,12 @@ class mxchange_cache $this->cache_ctime = $ctime; // Is the cache file outdated? - if (((time() - $ctime) >= $this->update_interval) && (!$ignore_ctime)) { + if (($status) && ((time() - $ctime) >= $this->update_interval)) { // Ok, we need an update! $status = false; + } elseif ($status) { + // Check on 'cache' extension + $status = $this->ext_version_matches("cache"); } // Return status @@ -125,17 +129,17 @@ 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); + ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); } } @@ -155,99 +159,106 @@ class mxchange_cache if (($k == "ext_keep") && ($v == "Y")) { $cacheArray['active_extensions'][$data['ext_name']] = $v; } // END - if - } // END - if + } elseif (is_array($v)) { + // Serialize and BASE64-encode the array + $v = base64_encode(serialize($v)); + } // 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 - ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); + ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); } } - 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); + 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 $data = array(); + $cache_version = null; // Load cache file - $this->cache_data = implode("", file($this->cache_inc)); - - // Execute cache file - eval($this->cache_data); + require_once($this->cache_inc); + // Is there an array? if (is_array($data)) { // Cache data - $this->cache_data = $data; + $this->cache_data[$this->cache_file] = $data; // Cache version found? - if (isset($cache_version)) { + if ((is_array($cache_version)) && (count($cache_version) > 0)) { // Remember it as well... - $this->cache_version = $cache_version; - } // END - if + $this->cache_version[$this->cache_file] = $cache_version; + } else { + // Invalid cache so destroy it + $this->cache_destroy(); + + // Clear cached data + $this->cache_data[$this->cache_file] = array(); + } // Return cache - return $this->cache_data; + return $this->cache_data[$this->cache_file]; } else { // Cache problem detected! $this->cache_destroy(); } } else { // Cache file not found or not readable - ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_CANNOT_LOAD_1.$this->cache_inc.CACHE_CANNOT_LOAD_2); + ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_CANNOT_LOAD_1.$this->cache_inc.CACHE_CANNOT_LOAD_2); } } - function cache_destroy() - { - if (FILE_READABLE($this->cache_inc)) - { + // Destroy an existing cache file + function cache_destroy() { + // Is the cache file there? + if (FILE_READABLE($this->cache_inc)) { // Remove cache file from system - @unlink($this->cache_inc); - if (!FILE_READABLE($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(); - } - else - { + } else { // Not removed! - ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_CANNOT_UNLINK_1.$this->cache_inc.CACHE_CANNOT_UNLINK_2); + ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_CANNOT_UNLINK_1.$this->cache_inc.CACHE_CANNOT_UNLINK_2); } - } - else - { + } else { // Does not exist! - ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_CANNOT_UNLINK_1.$this->cache_inc.CACHE_CANNOT_UNLINK_2); + ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_CANNOT_UNLINK_1.$this->cache_inc.CACHE_CANNOT_UNLINK_2); } } - function cache_remove($search, $data, $array) - { + function cache_remove($search, $data, $array) { global $ARRAY; if ((FILE_READABLE($this->cache_inc)) && (is_writeable($this->cache_inc))) { // Load cache into dummy array @@ -263,39 +274,47 @@ 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! - ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); + ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); + } + } + + 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) - { + 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(); @@ -315,32 +334,18 @@ 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 { // Cannot write to cache! - ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); + ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); } } @@ -351,10 +356,10 @@ class mxchange_cache $ext_ver = GET_EXT_VERSION($ext_name); // Write cache line to file - @fwrite($this->cache_pointer, "\$cache_version = \"".$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); + ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); } } @@ -365,9 +370,8 @@ class mxchange_cache // Get extension version $ext_ver = GET_EXT_VERSION($ext_name); - //* DEBUG: */ echo __METHOD__.": ext_name={$ext_name},ext_ver={$ext_ver},cache_version={$this->cache_version}
\n"; // Compare both - return ($ext_ver == $this->cache_version); + return ((isset($this->cache_version[$this->cache_file][$ext_name])) && ($this->cache_version[$this->cache_file][$ext_name] == $ext_ver)); } function add_raw_row ($key, $value) { @@ -375,7 +379,7 @@ class mxchange_cache $line = ""; // String or non-string? ;-) - if (is_string($value)) { + if ((is_string($value)) || (is_null($value))) { // String... $line = "\$data['".$key."'][] = \"".$value."\";\n"; } else { @@ -386,6 +390,10 @@ class mxchange_cache // Return line return $line; } + + function getStatus () { + return $this->ret; + } } // ?>