X-Git-Url: https://git.mxchange.org/?p=mailer.git;a=blobdiff_plain;f=inc%2Flibs%2Fcache_functions.php;h=a34313d1eb37053b5b06f6e32856b185d86909ad;hp=81a695e9cd5a20314562c20f069becaa9d2745e7;hb=f928ad2bed60fa256d0641eaf6d2c027a2944688;hpb=5deec33be1baf2135eefc2bbb0d1b63c6cbd2f9a diff --git a/inc/libs/cache_functions.php b/inc/libs/cache_functions.php index 81a695e9cd..a34313d1eb 100644 --- a/inc/libs/cache_functions.php +++ b/inc/libs/cache_functions.php @@ -10,7 +10,12 @@ * -------------------------------------------------------------------- * * Kurzbeschreibung : Funktionen fuer die admins-Erweiterung * * -------------------------------------------------------------------- * - * * + * $Revision:: $ * + * $Date:: $ * + * $Tag:: 0.2.1-FINAL $ * + * $Author:: $ * + * Needs to be in all Files and every File needs "svn propset * + * svn:keywords Date Revision" (autoprobset!) at least!!!!!! * * -------------------------------------------------------------------- * * Copyright (c) 2003 - 2008 by Roland Haeder * * For more information visit: http://www.mxchange.org * @@ -33,53 +38,61 @@ // Some security stuff... if (!defined('__SECURITY')) { - $INC = substr(dirname(__FILE__), 0, strpos(dirname(__FILE__), "/inc") + 4) . "/security.php"; + $INC = substr(dirname(__FILE__), 0, strpos(dirname(__FILE__), '/inc') + 4) . '/security.php'; require($INC); } // Caching class class CacheSystem { // Define variables - var $ret = "init"; - var $path = ""; - var $inc = ""; + var $ret = 'init'; + var $path = ''; + var $inc = ''; + var $fqfn = ''; var $pointer = false; var $data = array(); var $version = array(); - var $name = ""; + var $name = ''; var $rebuilt = array(); + var $extension = '.cache'; + var $statusDone = 'done'; // Constructor function CacheSystem ($interval, $path, $tested) { // Failed is the default - $this->ret = "failed"; + $this->ret = 'failed'; // Remeber path $this->path = $path; // Check if path exists - if ((is_dir($path)) && (!$tested)) { + if ((isDirectory($path)) && ($tested === false)) { + // Make FQFN for dummy file + $fqfn = $path . 'dummy.tmp'; + // Check if we can create a file inside the path - touch($path."dummy.tmp", 'w'); - if (FILE_READABLE($path."dummy.tmp")) { + touch($fqfn, 'w'); + + // Is the file there? + if (isFileReadable($fqfn)) { // Yes, we can do. So let's remove it - unlink($path."dummy.tmp"); + removeFile($fqfn); // Is there a .htaccess file? - if (FILE_READABLE($path.".htaccess")) { + if (isFileReadable($path . '.htaccess')) { // Update database that we have tested it - UPDATE_CONFIG("cache_tested", 1); + updateConfiguration('cache_tested', 1); // All done! - $this->ret = "done"; + $this->ret = $this->statusDone; } else { // Stop! Set a .htaccess file first - $this->ret = "htaccess"; + $this->ret = 'htaccess'; } } } elseif ($tested) { // System already tested - $this->ret = "done"; + $this->ret = $this->statusDone; } } @@ -88,31 +101,35 @@ class CacheSystem { // Remember cache file $this->name = $cacheName; + // Construct include filename for loadIncludeOnce() call + $this->inc = $this->path . $cacheName . $this->extension; + // Construct FQFN (full qualified file name) - $this->inc = $this->path . $cacheName . ".cache"; + $this->fqfn = constant('PATH') . $this->inc; // Check if file exists and if version matches - $status = (FILE_READABLE($this->inc) && (is_writeable($this->inc)) && ($this->extensionVersionMatches("cache"))); + $status = ($this->isCacheReadable() && (is_writeable($this->fqfn)) && ($this->extensionVersionMatches('cache'))); // Return status return $status; } + // Initializes the cache file function init () { // This will destory an existing cache file! - if ($this->ret == "done") { + if ($this->ret == $this->statusDone) { // Create file - if (FILE_READABLE($this->inc)) chmod($this->inc, 0666); - $this->pointer = fopen($this->inc, 'w') or mxchange_die("Cannot write to cache ".$this->inc." !"); + if ($this->isCacheReadable()) changeMode($this->fqfn, 0666); + $this->pointer = fopen($this->fqfn, 'w') or app_die(__METHOD__, __LINE__, "Cannot write to cache ".$this->fqfn." !"); // Add open PHP tag fwrite($this->pointer, "storeExtensionVersion("cache"); + $this->storeExtensionVersion('cache'); } else { // Cannot create file - addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); + addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".getMessage('CACHE_PROBLEMS_DETECTED')); } } @@ -122,13 +139,13 @@ class CacheSystem { // Write every array element to cache file 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") { + if ((substr($k, 0, 4) == 'ext_') && (isset($data['ext_name'])) && (isset($data['ext_id']))) { + if ($k != 'ext_name') { $GLOBALS['cache_array']['extensions'][$k][$data['ext_name']] = $v; } else { $GLOBALS['cache_array']['extensions'][$k][$data['ext_id']] = $v; } - if (($k == "ext_keep") && ($v == "Y")) { + if (($k == 'ext_keep') && ($v == 'Y')) { $GLOBALS['cache_array']['active_extensions'][$data['ext_name']] = $v; } // END - if } elseif (is_array($v)) { @@ -141,7 +158,7 @@ class CacheSystem { } } else { // Cannot create file - addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); + addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".getMessage('CACHE_PROBLEMS_DETECTED')); } } @@ -155,7 +172,7 @@ class CacheSystem { fclose($this->pointer); // Set rights - if (FILE_READABLE($this->inc)) chmod($this->inc, 0666); + if ($this->isCacheReadable()) changeMode($this->fqfn, 0666); // Remove pointer $this->pointer = false; @@ -171,13 +188,13 @@ class CacheSystem { } // END - if // Is the cache file there? - if (FILE_READABLE($this->inc)) { + if ($this->isCacheReadable()) { // Prepare temporary array $data = array(); $cache_version = null; // Load cache file - LOAD_INC_ONCE($this->inc); + require($this->inc); // Is there an array? if (is_array($data)) { @@ -204,37 +221,66 @@ class CacheSystem { } } else { // Cache file not found or not readable - addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".CACHE_CANNOT_LOAD_1.$this->inc.CACHE_CANNOT_LOAD_2); + addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".CACHE_CANNOT_LOAD_1.$this->fqfn.CACHE_CANNOT_LOAD_2); } } // Destroy an existing cache file - function destroyCacheFile () { + function destroyCacheFile ($removeArray = false, $force = false) { + // Only run in regular output mode + if ((getOutputMode() != 0) && ($force === false)) { + // Debug message if allowed + if (isDebugModeEnabled()) { + // Debug message + debug_report_bug('Not removing cache ' . $this->name . ' in output_mode=' . getOutputMode()); + } // END - if + + // Abort here + return; + } // END - if + // Is the cache file there? - if ((!isset($this->rebuilt[$this->name])) && (FILE_READABLE($this->inc))) { + if ((!isset($this->rebuilt[$this->name])) && ($this->isCacheReadable())) { // Close cache $this->finalize(); + // Debug-mode enabled? + if (isDebugModeEnabled()) { + // Log removal of cache + DEBUG_LOG(__METHOD__, __LINE__, 'removing cache: ' . $this->name); + } // END - if + // Remove cache file from system - //* DEBUG: */ print __METHOD__."(".__LINE__."): {$this->name} - DESTROYED!
\n"; - unlink($this->inc); + removeFile($this->fqfn); + + // Shall we remove the array from memory? + if ($removeArray === true) { + // Debug message if allowed + if (isDebugModeEnabled()) { + // Debug message + DEBUG_LOG(__METHOD__, __LINE__, 'removing array!'); + } // END - if + + // Remove it from memory + unset($GLOBALS['cache_array'][$this->name]); + } // END - if // Is the file there? - if (!FILE_READABLE($this->inc)) { + if (!$this->isCacheReadable()) { // The cache does no longer exist so kill the content unset($this->data[$this->name]); unset($this->version[$this->name]); $this->rebuilt[$this->name] = true; } else { // Not removed! - addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".CACHE_CANNOT_UNLINK_1.$this->inc.CACHE_CANNOT_UNLINK_2); + addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".CACHE_CANNOT_UNLINK_1.$this->fqfn.CACHE_CANNOT_UNLINK_2); } } // END - if } // Unused method: function removeEntry ($search, $data, $array) { - if ((FILE_READABLE($this->inc)) && (is_writeable($this->inc))) { + if (($this->isCacheReadable()) && (is_writeable($this->fqfn))) { // Load cache into dummy array $dummy = $this->getArrayFromCache(); @@ -258,7 +304,7 @@ class CacheSystem { } } else { // Cannot write to cache! - addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); + addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".getMessage('CACHE_PROBLEMS_DETECTED')); } } @@ -267,7 +313,7 @@ class CacheSystem { foreach ($array as $k => $v) { if (is_array($v)) { // Multi line(s) found - $LINE = ""; + $LINE = ''; foreach($v as $k2 => $v2) { // Put every array element in a row... $LINE .= $this->rewriteEntry($k, $v2); @@ -282,13 +328,13 @@ class CacheSystem { } // END - foreach } else { // Cannot write array! - addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); + addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".getMessage('CACHE_PROBLEMS_DETECTED')); } } // Unused method function replaceEntry ($search, $replace, $search_key, $array) { - if ((FILE_READABLE($this->inc)) && (is_writeable($this->inc))) { + if (($this->isCacheReadable()) && (is_writeable($this->fqfn))) { // Load cache into dummy array $dummy = $this->getArrayFromCache(); @@ -319,10 +365,11 @@ class CacheSystem { } // END - if } else { // Cannot write to cache! - addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); + addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".getMessage('CACHE_PROBLEMS_DETECTED')); } } + // Writes the version of given extension to the cache file function storeExtensionVersion ($ext_name) { // Valid cache pointer? if (is_resource($this->pointer)) { @@ -337,10 +384,11 @@ class CacheSystem { //* DEBUG: */ print __METHOD__."(".__LINE__."): {$this->name} - {$ext_name}={$ext_ver}
\n"; } else { // Cannot create file - addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".CACHE_PROBLEMS_DETECTED); + addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".getMessage('CACHE_PROBLEMS_DETECTED')); } } + // Checks wether versions from cache and extension matches function extensionVersionMatches ($ext_name) { // Load cache (dummy) $this->getArrayFromCache(); @@ -353,16 +401,18 @@ class CacheSystem { //* DEBUG: */ print __METHOD__."(".__LINE__."): cache={$this->name},ext_name={$ext_name} - {$ext_ver}/{$this->version[$this->name][$ext_name]}
\n"; } else { // No cache version found! - DEBUG_LOG(__METHOD__, __LINE__, "Cache {$this->name} has missing entry for extension {$ext_name}!"); + DEBUG_LOG(__METHOD__, __LINE__, "Cache {$this->name} has missing version entry for extension {$ext_name}!"); } // Compare both return ((isset($this->version[$this->name][$ext_name])) && ($this->version[$this->name][$ext_name] == $ext_ver)); } + // Rewrit the entry so it can be stored in cache file + // @TODO Add support for more types which break in last else-block function rewriteEntry ($key, $value) { // Init line - $line = ""; + $line = ''; // String or non-string? ;-) if (is_string($value)) { @@ -374,8 +424,10 @@ class CacheSystem { } elseif (is_bool($value)) { // Boolean value if ($value === true) { + // True $line = "\$data['".$key."'][] = true;\n"; } else { + // False $line = "\$data['".$key."'][] = false;\n"; } } else { @@ -387,19 +439,27 @@ class CacheSystem { return $line; } + // Getter for cache status function getStatus () { return $this->ret; } -} + + // Checks wether the current cache file is readable + function isCacheReadable () { + return isIncludeReadable($this->inc); + } + +} // END - class // Destroy the cache on extension changes function FILTER_CACHE_DESTROY_ON_EXT_CHANGE ($data) { + // Return the data anyway if there is no cache extension + if (!isCacheInstanceValid()) return $data; + // Remove cache - if (EXT_IS_ACTIVE("cache")) { - if ($GLOBALS['cache_instance']->loadCacheFile("config")) $GLOBALS['cache_instance']->destroyCacheFile(); - if ($GLOBALS['cache_instance']->loadCacheFile("extensions")) $GLOBALS['cache_instance']->destroyCacheFile(); - if ($GLOBALS['cache_instance']->loadCacheFile("modreg")) $GLOBALS['cache_instance']->destroyCacheFile(); - } // END - if + if ($GLOBALS['cache_instance']->loadCacheFile('config')) $GLOBALS['cache_instance']->destroyCacheFile(false); + if ($GLOBALS['cache_instance']->loadCacheFile('extensions')) $GLOBALS['cache_instance']->destroyCacheFile(false); + if ($GLOBALS['cache_instance']->loadCacheFile('modreg')) $GLOBALS['cache_instance']->destroyCacheFile(false); // Return it return $data; @@ -407,31 +467,46 @@ function FILTER_CACHE_DESTROY_ON_EXT_CHANGE ($data) { // Destroy the cache on changing admin function FILTER_CACHE_DESTROY_ON_ADMIN_CHANGE () { + // Skip this step if the cache instance is not there + if (!isCacheInstanceValid()) return false; + // Remove cache - if (EXT_IS_ACTIVE("cache")) { - if ($GLOBALS['cache_instance']->loadCacheFile("admins")) $GLOBALS['cache_instance']->destroyCacheFile(); - } // END - if + if ($GLOBALS['cache_instance']->loadCacheFile('admins')) $GLOBALS['cache_instance']->destroyCacheFile(false); } // Destroy all cache files function FILTER_CACHE_DESTROY_ALL () { - // Remove cache - if (EXT_IS_ACTIVE("cache")) { - if ($GLOBALS['cache_instance']->loadCacheFile("admins")) $GLOBALS['cache_instance']->destroyCacheFile(); - if ($GLOBALS['cache_instance']->loadCacheFile("admins_acls")) $GLOBALS['cache_instance']->destroyCacheFile(); - if ($GLOBALS['cache_instance']->loadCacheFile("config")) $GLOBALS['cache_instance']->destroyCacheFile(); - if ($GLOBALS['cache_instance']->loadCacheFile("extensions")) $GLOBALS['cache_instance']->destroyCacheFile(); - if ($GLOBALS['cache_instance']->loadCacheFile("modreg")) $GLOBALS['cache_instance']->destroyCacheFile(); - if ($GLOBALS['cache_instance']->loadCacheFile("refdepths")) $GLOBALS['cache_instance']->destroyCacheFile(); - if ($GLOBALS['cache_instance']->loadCacheFile("refsystem")) $GLOBALS['cache_instance']->destroyCacheFile(); - if ($GLOBALS['cache_instance']->loadCacheFile("themes")) $GLOBALS['cache_instance']->destroyCacheFile(); - } // END - if + // Skip this step if the cache instance is not there + //* DEBUG: */ DEBUG_LOG(__FUNCTION__, __LINE__, 'Called!'); + if (!isCacheInstanceValid()) return false; + + // Remove cache files + if ($GLOBALS['cache_instance']->loadCacheFile('admins')) $GLOBALS['cache_instance']->destroyCacheFile(false); + if ($GLOBALS['cache_instance']->loadCacheFile('admins_acls')) $GLOBALS['cache_instance']->destroyCacheFile(false); + if ($GLOBALS['cache_instance']->loadCacheFile('config')) $GLOBALS['cache_instance']->destroyCacheFile(false); + if ($GLOBALS['cache_instance']->loadCacheFile('extensions')) $GLOBALS['cache_instance']->destroyCacheFile(false); + if ($GLOBALS['cache_instance']->loadCacheFile('modreg')) $GLOBALS['cache_instance']->destroyCacheFile(false); + if ($GLOBALS['cache_instance']->loadCacheFile('refdepths')) $GLOBALS['cache_instance']->destroyCacheFile(false); + if ($GLOBALS['cache_instance']->loadCacheFile('refsystem')) $GLOBALS['cache_instance']->destroyCacheFile(false); + if ($GLOBALS['cache_instance']->loadCacheFile('themes')) $GLOBALS['cache_instance']->destroyCacheFile(false); + if ($GLOBALS['cache_instance']->loadCacheFile('revision')) $GLOBALS['cache_instance']->destroyCacheFile(false); + if ($GLOBALS['cache_instance']->loadCacheFile('filter')) $GLOBALS['cache_instance']->destroyCacheFile(false); + //* DEBUG: */ DEBUG_LOG(__FUNCTION__, __LINE__, 'Done!'); +} + +// Filter for purging 'filter' cache +function FILTER_CACHE_DESTROY_FILTER () { + // Skip this step if the cache instance is not there + if ((!isCacheInstanceValid()) || (getConfig('update_filter_usage') == 'N')) return false; + + // Remove cache files + if ($GLOBALS['cache_instance']->loadCacheFile('filter')) $GLOBALS['cache_instance']->destroyCacheFile(false); } // Filter for purging entire admin menu cache function FILTER_CACHE_PURGE_ADMIN_MENU () { // Just call the function - CACHE_PURGE_ADMIN_MENU(); + cachePurgeAdminMenu(); } //