X-Git-Url: https://git.mxchange.org/?p=mailer.git;a=blobdiff_plain;f=inc%2Flibs%2Fcache_functions.php;h=0c342e1257ca8c78736ee2fde8e246c214a52337;hp=53e4847e901fb0526959b214b132ba8674e953d0;hb=e3934352dffa6eb9da59a137ae1a9414e5b4d80b;hpb=36c3c8b749a88ce05ad0fda81e00047f9cb5433f diff --git a/inc/libs/cache_functions.php b/inc/libs/cache_functions.php index 53e4847e90..0c342e1257 100644 --- a/inc/libs/cache_functions.php +++ b/inc/libs/cache_functions.php @@ -1,7 +1,7 @@ ret = 'failed'; - - // Remeber path - $this->path = $path; - - // Check if path exists - 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($fqfn, 'w'); - - // Is the file there? - if (isFileReadable($fqfn)) { - // Yes, we can do. So let's remove it - removeFile($fqfn); - - // Is there a .htaccess file? - if (isFileReadable($path . '.htaccess')) { - // Update database that we have tested it - updateConfiguration('cache_tested', 1); - - // All done! - $this->ret = $this->statusDone; - } else { - // Stop! Set a .htaccess file first - $this->ret = 'htaccess'; - } - } - } elseif ($tested) { - // System already tested - $this->ret = $this->statusDone; - } - } - - // Checks validity of cache file and if content is given - function loadCacheFile ($cacheName, $forceContent = false) { - // 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->fqfn = constant('PATH') . $this->inc; - - // Check if file exists and if version matches - $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 == $this->statusDone) { - // Create file - 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'); - } else { - // Cannot create file - addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".getMessage('CACHE_PROBLEMS_DETECTED')); - } - } - - function addRow ($data) { - // Is the pointe rvalid? - if (is_resource($this->pointer)) { - // 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') { - $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')) { - $GLOBALS['cache_array']['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->pointer, $this->rewriteEntry($k, $v)); - } - } else { - // Cannot create file - addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".getMessage('CACHE_PROBLEMS_DETECTED')); - } - } - - function finalize () { - // Quit function when no pointer is set - if (is_resource($this->pointer)) { - // Write footer - fwrite($this->pointer, "?>\n"); - - // Close file add destroy handler - fclose($this->pointer); - - // Set rights - if ($this->isCacheReadable()) changeMode($this->fqfn, 0666); - - // Remove pointer - $this->pointer = false; - //* DEBUG: */ OUTPUT_HTML(__METHOD__."(".__LINE__."): {$this->name} - FINALIZED!
"); - } // END - if - } - - function getArrayFromCache () { - // Is the cache already loaded? - if (isset($this->data[$this->name])) { - // Return it's content! - return $this->data[$this->name]; - } // END - if - - // Is the cache file there? - if ($this->isCacheReadable()) { - // Prepare temporary array - $data = array(); - $cache_version = null; - - // Load cache file - require($this->inc); - - // Is there an array? - if (is_array($data)) { - // Cache data - $this->data[$this->name] = $data; - - // Cache version found? - if ((is_array($cache_version)) && (count($cache_version) > 0)) { - // Remember it as well... - $this->version[$this->name] = $cache_version; - } else { - // Invalid cache so destroy it - $this->destroyCacheFile(); - - // Clear cached data - $this->data[$this->name] = array(); - } - - // Return cache - return $this->data[$this->name]; - } else { - // Cache problem detected! - $this->destroyCacheFile(); - } - } else { - // Cache file not found or not readable - addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".CACHE_CANNOT_LOAD_1.$this->fqfn.CACHE_CANNOT_LOAD_2); - } - } - - // Destroy an existing cache file - 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])) && ($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 - 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 (!$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->fqfn.CACHE_CANNOT_UNLINK_2); - } - } // END - if - } - - // Unused method: - function removeEntry ($search, $data, $array) { - if (($this->isCacheReadable()) && (is_writeable($this->fqfn))) { - // Load cache into dummy array - $dummy = $this->getArrayFromCache(); - - // Search for key in array - $key = array_search($data, $dummy[$search]); - if (!empty($key)) { - // Key (hopefully) found? - foreach ($array as $a) { - // So we can remove all elements as requested - unset($dummy[$a][$key]); - } // END - foreach - - // Flush array to cache file - $this->init(); - - // Write array out - $this->writeArray($dummy); - - // Close cache file - $this->finalize(); - } - } else { - // Cannot write to cache! - addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".getMessage('CACHE_PROBLEMS_DETECTED')); - } - } - - function writeArray ($array) { - if (is_resource($this->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->rewriteEntry($k, $v2); - } - } else { - // Single line found - $LINE = $this->rewriteEntry($k, $v); - } - - // Write line(s) - fwrite($this->pointer, $LINE); - } // END - foreach - } else { - // Cannot write array! - addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".getMessage('CACHE_PROBLEMS_DETECTED')); - } - } - - // Unused method - function replaceEntry ($search, $replace, $search_key, $array) { - if (($this->isCacheReadable()) && (is_writeable($this->fqfn))) { - // Load cache into dummy array - $dummy = $this->getArrayFromCache(); - - // Check if $dummy is valid (prevents some errors) - 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) { - $key = $search_key; - // Key (hopefully) found? - foreach ($dummy as $a => $v) { - // So we can update all entries - if ($a == $search) { - // Update now... - $dummy[$a][$search_key] = $replace; - } // END - if - } // END - foreach - - // Flush array to cache file - $this->init(); - - // Write array out - $this->writeArray($dummy); - - // Close cache file - $this->finalize(); - } // END - if - } // END - if - } else { - // Cannot write to cache! - 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)) { - // Get extension version - $ext_ver = GET_EXT_VERSION($ext_name); - - // Write cache line to file - fwrite($this->pointer, "\$cache_version['".$ext_name."'] = \"".$ext_ver."\";\n"); - - // Add the extension version to object (DO NOT REMOVE IT! Endless loop...) - $this->version[$this->name][$ext_name] = $ext_ver; - //* DEBUG: */ OUTPUT_HTML(__METHOD__."(".__LINE__."): {$this->name} - {$ext_name}={$ext_ver}
"); - } else { - // Cannot create file - 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(); - - // Get extension version - $ext_ver = GET_EXT_VERSION($ext_name); - - // Debug messages - if (isset($this->version[$this->name][$ext_name])) { - //* DEBUG: */ OUTPUT_HTML(__METHOD__."(".__LINE__."): cache={$this->name},ext_name={$ext_name} - {$ext_ver}/{$this->version[$this->name][$ext_name]}
"); - } else { - // No cache version found! - 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 = ''; - - // String or non-string? ;-) - if (is_string($value)) { - // String... - $line = "\$data['".$key."'][] = \"".$value."\";\n"; - } elseif (is_null($value)) { - // Null - $line = "\$data['".$key."'][] = null;\n"; - } elseif (is_bool($value)) { - // Boolean value - if ($value === true) { - // True - $line = "\$data['".$key."'][] = true;\n"; - } else { - // False - $line = "\$data['".$key."'][] = false;\n"; - } - } else { - // Non-string - $line = "\$data['".$key."'][] = ".$value.";\n"; - } - - // Return line - 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 ($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; -} - -// 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 ($GLOBALS['cache_instance']->loadCacheFile('admins')) $GLOBALS['cache_instance']->destroyCacheFile(false); -} - -// Destroy all cache files -function FILTER_CACHE_DESTROY_ALL () { - // 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 - cachePurgeAdminMenu(); -} - -// +// [EOF] ?>