X-Git-Url: https://git.mxchange.org/?p=mailer.git;a=blobdiff_plain;f=inc%2Flibs%2Fcache_functions.php;h=44df62bedea920e5cb094042077a2d09bdfc163a;hp=9e5202d55878008d3336176e4a93091e0261af52;hb=ec5bcdd7331073503aff5742884785b2fdd498e3;hpb=61bddb167e29e7275f5a1c9fa8cb80431fa5ee6f diff --git a/inc/libs/cache_functions.php b/inc/libs/cache_functions.php index 9e5202d558..44df62bede 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 { @@ -47,51 +47,47 @@ class mxchange_cache var $cache_inc = ""; var $cache_ctime = 0; var $cache_pointer = false; + var $cache_data = ""; + var $cache_version = ""; // 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 ((file_exists($path)) && (is_dir($path)) && (!$tested)) - { + if ((is_dir($path)) && (!$tested)) { // Check if we can create a file inside the path @touch($path."dummy.tmp", 'w'); - if (file_exists($path."dummy.tmp")) { + if (FILE_READABLE($path."dummy.tmp")) { // Yes, we can do. So let's remove it @unlink($path."dummy.tmp"); // Is there a .htaccess file? - if (file_exists($path.".htaccess")) { + if (FILE_READABLE($path.".htaccess")) { // Update database that we have tested it - $result = SQL_QUERY("UPDATE "._MYSQL_PREFIX."_config SET cache_tested='1' WHERE config=0 LIMIT 1", __FILE__, __LINE__); - $this->ret="done"; + 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) - { + function cache_file($file, $ignore_ctime=false) { global $INC; // Construct FQFN (full qualified file name) $inc = $this->cache_path.$file.".cache"; @@ -100,37 +96,33 @@ class mxchange_cache $this->cache_inc = $inc; // Check if file exists - $status = (file_exists($inc) && (is_readable($inc)) && (is_writeable($inc))); - if ($status) - { + $status = (FILE_READABLE($inc) && (is_writeable($inc))); + if ($status) { // Yes, it does. So let's get it's last changed date/time $ctime = filectime($inc); - } - else - { + } else { // No, it doesn't. Zero date/time - $ctime = "0"; + $ctime = 0; } // Remember change date/time in class $this->cache_ctime = $ctime; // Is the cache file outdated? - if (((time() - $ctime) >= $this->update_interval) && (!$ignore_ctime)) - { + if (((time() - $ctime) >= $this->update_interval) && (!$ignore_ctime)) { // Ok, we need an update! $status = false; } + + // Return status return $status; } - function cache_init($array) - { + function cache_init($array) { // This will destory an existing cache file! - if ($this->ret == "done") - { + if ($this->ret == "done") { // Create file - if (file_exists($this->cache_inc)) @chmod($this->cache_inc, 0666); + 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." !"); // Begin of cache file @@ -138,19 +130,35 @@ class mxchange_cache // Remember file pointer $this->cache_pointer = $fp; - } - else - { + } else { // Cannot create file ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); } } - function add_row($data) { + function add_row ($data) { + global $cacheArray; + if (is_resource($this->cache_pointer)) { // Write every array element to cache file - foreach ($data as $k=>$v) { - @fwrite($this->cache_pointer, "\$data['".$k."'][] = \"".$v."\";\n"); + foreach ($data as $k => $v) { + // Write global cache array for immediate access + if ((substr($k, 0, 4) == "ext_") && (isset($data['ext_name'])) && (isset($data['ext_id']))) { + if ($k != "ext_name") { + $cacheArray['extensions'][$k][$data['ext_name']] = $v; + } else { + $cacheArray['extensions'][$k][$data['ext_id']] = $v; + } + if (($k == "ext_keep") && ($v == "Y")) { + $cacheArray['active_extensions'][$data['ext_name']] = $v; + } // 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)); } } else { // Cannot create file @@ -168,7 +176,7 @@ class mxchange_cache @fclose($this->cache_pointer); // Set rights - if (file_exists($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); @@ -180,28 +188,36 @@ class mxchange_cache } } - function cache_load() - { - if ((file_exists($this->cache_inc)) && (is_readable($this->cache_inc))) - { + function cache_load() { + // Is the cache file there? + if (FILE_READABLE($this->cache_inc)) { // Prepare temporary array $data = array(); + $cache_version = null; // Load cache file - $cache = implode("", file($this->cache_inc)); + $this->cache_data = implode("", file($this->cache_inc)); // Execute cache file - eval($cache); + eval($this->cache_data); + if (is_array($data)) { + // Cache data + $this->cache_data = $data; + + // Cache version found? + if ((isset($cache_version)) && (is_array($cache_version))) { + // Remember it as well... + $this->cache_version = $cache_version; + } // END - if + // Return cache - return $data; + return $this->cache_data; } else { // Cache problem detected! $this->cache_destroy(); } - } - else - { + } else { // Cache file not found or not readable ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_CANNOT_LOAD_1.$this->cache_inc.CACHE_CANNOT_LOAD_2); } @@ -209,11 +225,11 @@ class mxchange_cache function cache_destroy() { - if (file_exists($this->cache_inc)) + if (FILE_READABLE($this->cache_inc)) { // Remove cache file from system @unlink($this->cache_inc); - if (!file_exists($this->cache_inc)) + if (!FILE_READABLE($this->cache_inc)) { // Close cache automatically (we don't need it anymore!) $this->cache_close(); @@ -234,18 +250,15 @@ class mxchange_cache function cache_remove($search, $data, $array) { global $ARRAY; - if ((file_exists($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(); // Search for key in array $key = array_search($data, $dummy[$search]); - if (!empty($key)) - { + if (!empty($key)) { // Key (hopefully) found? - foreach ($array as $a) - { + foreach ($array as $a) { // So we can remove all elements as requested unset($dummy[$a][$key]); } @@ -253,22 +266,17 @@ 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)) - { + foreach ($dummy as $k => $v) { + if (is_array($v)) { // Multi line(s) found $LINE = ""; - foreach($v as $k2=>$v2) - { + foreach($v as $k2 => $v2) { // Put every array element in a row... - $LINE .= "\$data['".$k."'][] = \"".$v2."\";\n"; + $LINE .= $this->add_raw_row($k, $v2); } - } - else - { + } else { // Single line found - $LINE = "\$data['".$k."'] = \"".$v."\";\n"; + $LINE = $this->add_raw_row($k, $v); } // Write line(s) @@ -278,9 +286,7 @@ class mxchange_cache // Close cache file fclose($fp); } - } - else - { + } else { // Cannot write to cache! ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); } @@ -289,25 +295,21 @@ class mxchange_cache function cache_replace($search, $replace, $search_key, $array) { global $ARRAY; - if ((file_exists($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(); // Check if $dummy is valid (prevents some errors) - if ((is_array($dummy)) && (isset($dummy[$search])) && (is_array($dummy[$search]))) - { + if ((is_array($dummy)) && (isset($dummy[$search])) && (is_array($dummy[$search]))) { // Search for key in array $key_found = array_key_exists($search_key, $dummy[$search]); - if ($key_found == true) - { + if ($key_found == true) { $key = $search_key; // Key (hopefully) found? - foreach ($dummy as $a=>$v) - { + foreach ($dummy as $a => $v) { // So we can update all entries - if ($a == $search) - { + if ($a == $search) { // Update now... $dummy[$a][$search_key] = $replace; } @@ -316,22 +318,17 @@ 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)) - { + foreach ($dummy as $k => $v) { + if (is_array($v)) { // Multi line(s) found $LINE = ""; - foreach($v as $k2=>$v2) - { + foreach($v as $k2 => $v2) { // Put every array element in a row... - $LINE .= "\$data['".$k."'][] = \"".$v2."\";\n"; + $LINE .= $this->add_raw_row($k, $v2); } - } - else - { + } else { // Single line found - $LINE = "\$data['".$k."'] = \"".$v."\";\n"; + $LINE = $this->add_raw_row($k, $v); } // Write line(s) @@ -342,13 +339,58 @@ class mxchange_cache fclose($fp); } } - } - else - { + } else { // Cannot write to cache! ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); } } + + function store_extension_version ($ext_name) { + // Valid cache pointer? + if (is_resource($this->cache_pointer)) { + // Get extension version + $ext_ver = GET_EXT_VERSION($ext_name); + + // Write cache line to file + @fwrite($this->cache_pointer, "\$cache_version['".$ext_name."'] = \"".$ext_ver."\";\n"); + } else { + // Cannot create file + ADD_FATAL(__FILE__."(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); + } + } + + function ext_version_matches ($ext_name) { + // Load cache (dummy) + $this->cache_load(); + + // 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 ((isset($this->cache_version[$ext_name])) && ($this->cache_version[$ext_name] == $ext_ver)); + } + + function add_raw_row ($key, $value) { + // Init line + $line = ""; + + // String or non-string? ;-) + if (is_string($value)) { + // String... + $line = "\$data['".$key."'][] = \"".$value."\";\n"; + } else { + // Non-string + $line = "\$data['".$key."'][] = ".$value.";\n"; + } + + // Return line + return $line; + } + + function getStatus () { + return $this->ret; + } } // ?>