X-Git-Url: https://git.mxchange.org/?p=mailer.git;a=blobdiff_plain;f=inc%2Fclasses%2Fcachesystem.class.php;h=095187b53146b4684399f46477c887c3b718b5a6;hp=ad755f5dc57b5acd5b14ec70063f61bfc8f76e14;hb=16e8327d8b9ac2f02cf49c6179e7148fc32b1066;hpb=f78b74a8758b7afd26327a01b54db60a1f9288a9 diff --git a/inc/classes/cachesystem.class.php b/inc/classes/cachesystem.class.php index ad755f5dc5..095187b531 100644 --- a/inc/classes/cachesystem.class.php +++ b/inc/classes/cachesystem.class.php @@ -1,7 +1,7 @@ ret = 'failed'; + // Construct full path + $this->fullPath = getPath() . getCachePath(); - // Remeber path + // Failed is the default + $this->setStatusCode('failed'); // Check if path exists - if (isDirectory(getConfig('CACHE_PATH'))) { - // Make FQFN for dummy file - $FQFN = getConfig('CACHE_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(getConfig('CACHE_PATH') . '.htaccess')) { - // All done! - $this->ret = $this->statusDone; - } else { - // Stop! Set a .htaccess file first - $this->ret = 'htaccess'; - } - } // END - if + if (isDirectory($this->fullPath)) { + // Is there a .htaccess file? + if (isFileReadable($this->fullPath . '.htaccess')) { + // All done! + $this->setStatusCode('done'); + } else { + // Stop! Set a .htaccess file first + $this->setStatusCode('htaccess'); + } } // END - if } @@ -94,17 +94,17 @@ class CacheSystem { $this->name = $cacheName; // Construct FQFN (full qualified file name) - $this->fqfn = getConfig('CACHE_PATH') . $cacheName . $this->extension; + $this->fqfn = $this->fullPath . $cacheName . $this->extension; // Check if file exists and if version matches if (!isset($this->status[$cacheName])) { // Pre-fetch cache here if found if ($this->isCacheReadable()) $this->getArrayFromCache(); - //* DEBUG: */ print($cacheName.'='.intval($this->isCacheReadable()).'/'.intval(is_writeable($this->fqfn)).'/'.intval($this->extensionVersionMatches('cache')).'
'); + //* DEBUG: */ debugOutput('cacheName='.$cacheName.',isCacheReadable='.intval($this->isCacheReadable()).',is_writeable='.intval(is_writeable($this->fqfn)).',extensionMatches='.intval($this->extensionVersionMatches('cache'))); $this->status[$cacheName] = ($this->isCacheReadable() && (is_writeable($this->fqfn)) && ($this->extensionVersionMatches('cache'))); } // END - if - //* DEBUG: */ print($cacheName.'='.intval($this->status[$cacheName]).'
'); + //* DEBUG: */ debugOutput('cacheName='.$cacheName.',status='.intval($this->status[$cacheName])); // Return status return $this->status[$cacheName]; @@ -113,19 +113,35 @@ class CacheSystem { // Initializes the cache file function init () { // This will destory an existing cache file! - if ($this->ret == $this->statusDone) { + if ($this->getStatusCode() == 'done') { // Reset read status $this->resetCacheReadStatus(); // 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." !"); + $this->pointer = fopen($this->fqfn, 'w') or reportBug(__METHOD__, __LINE__, 'Cannot write to cache ' . $this->fqfn . ' !'); // Add open PHP tag - fwrite($this->pointer, "writeLine('".__LINE__."): ".getMessage('CACHE_PROBLEMS_DETECTED')); + reportBug(__METHOD__, __LINE__, 'Problems with cache directory detected, getStatusCode()=' . $this->getStatusCode()); + } + } + + /** + * Writes a line to the pointer and adds a \n (new-line) to the end + * + * @access private + */ + function writeLine ($line) { + // Is the pointer a valid resource? + if (is_resource($this->pointer)) { + // Write the line + fwrite($this->pointer, $line . chr(10)); + } else { + // Something bad happened + reportBug(__METHOD__, __LINE__, 'Pointer type is ' . gettype($this->pointer) . ', expected is resource.'); } } @@ -136,6 +152,7 @@ class CacheSystem { unset($this->status[$this->name]); } + // Adds a data row (array) to cache file and global cache array function addRow ($data) { // Is the pointe rvalid? if (is_resource($this->pointer)) { @@ -149,22 +166,81 @@ class CacheSystem { $GLOBALS['cache_array']['extension'][$k][$data['ext_name']] = $v; } if (($k == 'ext_keep') && ($v == 'Y')) { - $GLOBALS['cache_array']['active_extensions'][$data['ext_name']] = $v; + $GLOBALS['cache_array']['always_active'][$data['ext_name']] = $v; } // END - if + } elseif ($this->name == 'config') { + // Configuration + $GLOBALS['cache_array']['config'][$data['config']][$k] = $v; + } elseif ($this->name == 'filter') { + // Filter + $GLOBALS['cache_array']['filter']['chains'][$data['filter_name']][$data['filter_function']] = $data['filter_active']; + $GLOBALS['cache_array']['filter']['counter'][$data['filter_name']][$data['filter_function']] = $data['filter_counter']; + $GLOBALS['cache_array']['filter']['loaded'][$data['filter_name']][$data['filter_function']] = TRUE; + } elseif ($this->name == 'modules') { + // Modules + $GLOBALS['cache_array']['modules'][$k][$data['module']] = $v; + } elseif ($this->name == 'admin') { + // Admin logins + if ($k == 'admin_id') { + $GLOBALS['cache_array']['admin'][$k][$data['login']] = $v; + } else { + $GLOBALS['cache_array']['admin'][$k][$data['admin_id']] = $v; + } + } elseif ($this->name == 'admin_acls') { + // Access control lines + array_push($GLOBALS['cache_array']['admin_acls'][$k][$data['admin_id']], $v); + } elseif ($this->name == 'refdepths') { + // Referral levels + $GLOBALS['cache_array']['refdepths'][$k][$data['id']] = $v; + } elseif ($this->name == 'refsystem') { + // Referral system + $GLOBALS['cache_array']['refsystem'][$k][$data['id']] = $v; + } elseif ($this->name == 'revision') { + // Revision data + $GLOBALS['cache_array']['revision'][$k][0] = $v; + } elseif ($this->name == 'themes') { + // Themes + if ($k == 'theme_path') { + $GLOBALS['cache_array']['themes'][$k][$data['id']] = $v; + } else { + $GLOBALS['cache_array']['themes'][$k][$data['theme_path']] = $v; + } + } elseif ($this->name == 'imprint') { + // Imprint + $GLOBALS['cache_array']['imprint'][$k][$data['imprint_id']] = $v; + } elseif ($this->name == 'points_data') { + // Table 'points_data' + $GLOBALS['cache_array']['points_data'][$k][$data['id']] = $v; + } elseif ($this->name == 'earning') { + // Table 'earning' + $GLOBALS['cache_array']['earning'][$k][$data['earning_id']] = $v; + } elseif ($this->name == 'payments') { + // Table 'payments' + $GLOBALS['cache_array']['payments'][$k][$data['id']] = $v; } elseif (is_array($v)) { // Serialize and BASE64-encode the array $v = base64_encode(serialize($v)); + } else { + // Finialize the cache and close it + $this->finalize(); + + // Remove cache + $this->removeCacheFile(TRUE); + + // Unsupported/unhandled cache detected + reportBug(__METHOD__, __LINE__, 'Unsupported cache ' . $this->name . ' detected, data=' . print_r($data, TRUE) . ',k=' . $k . ',v=' . $v); } // Write cache line to file - fwrite($this->pointer, $this->rewriteEntry($k, $v)); - } + $this->writeLine($this->rewriteEntry($k, $v)); + } // END - foreach } else { // Cannot create file - addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".getMessage('CACHE_PROBLEMS_DETECTED')); + reportBug(__METHOD__, __LINE__, 'Problem with cache detected, no resource! pointer[]=' . gettype($this->pointer)); } } + // Closes cache file with closing PHP tag function finalize () { // Quit function when no pointer is set if (is_resource($this->pointer)) { @@ -172,7 +248,7 @@ class CacheSystem { $this->storeExtensionVersion('cache'); // Write footer - fwrite($this->pointer, "?>\n"); + $this->writeLine('?>'); // Close file add destroy handler fclose($this->pointer); @@ -185,11 +261,12 @@ class CacheSystem { // Remove pointer and status unset($this->status[$this->name]); - $this->pointer = false; - //* DEBUG: */ outputHtml(__METHOD__."(".__LINE__."): {$this->name} - FINALIZED!
"); + $this->pointer = FALSE; + //* DEBUG: */ logDebugMessage(__METHOD__, __LINE__, 'name=' . $this->name . ' - FINALIZED!'); } // END - if } + // Loads cache file and returns an array of the cached data function getArrayFromCache () { // Is the cache already loaded? if (isset($this->data[$this->name])) { @@ -200,7 +277,7 @@ class CacheSystem { // Is the cache file there? if ($this->isCacheReadable()) { // Load cache file - require($this->fqfn); + include($this->fqfn); // Is there an array? if (isset($this->data[$this->name])) { @@ -225,30 +302,32 @@ class CacheSystem { } // END - if } else { // Cache file not found or not readable - debug_report_bug($this->name); - addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".sprintf(getMessage('CACHE_CANNOT_LOAD'), $this->fqfn)); + reportBug(__METHOD__, __LINE__, '{%message,CACHE_CANNOT_LOAD=' . $this->name . '%}'); // Try to remove it $this->removeCacheFile(); } + + // Always return an empty array if we have trouble or no data + return array(); } // Destroy an existing cache file - function removeCacheFile ($removeArray = false, $force = false) { + function removeCacheFile ($force = FALSE) { // Reset read status $this->resetCacheReadStatus(); // Debug message - /* DEBUG: */ logDebugMessage(__METHOD__, __LINE__, sprintf("%s should be removed.", $this->name)); + //* DEBUG: */ logDebugMessage(__METHOD__, __LINE__, sprintf("%s should be removed.", $this->name)); // Is the cache file not yet rebuilt? if ((!isset($this->rebuilt[$this->name])) && ($this->isCacheReadable())) { // Only run in regular output mode - if ((getOutputMode() != 0) && ($force === false)) { + if ((!isHtmlOutputMode()) && ($force === FALSE)) { // Debug message if allowed if (isDebugModeEnabled()) { // Debug message - debug_report_bug('Not removing cache ' . $this->name . ' in output_mode=' . getOutputMode()); + logDebugMessage(__METHOD__, __LINE__, 'Not removing cache ' . $this->name . ' in output_mode=' . getScriptOutputMode()); } // END - if // Abort here @@ -265,39 +344,28 @@ class CacheSystem { } // END - if // Remove cache file from system + //* DEBUG: */ reportBug(__METHOD__, __LINE__, 'About to remove ' . basename($this->fqfn) . '!'); removeFile($this->fqfn); // Reset read status $this->resetCacheReadStatus(); - // Shall we remove the array from memory? - if ($removeArray === true) { - // Debug message if allowed - if (isDebugModeEnabled()) { - // Debug message - logDebugMessage(__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; + $this->rebuilt[$this->name] = TRUE; } else { // Not removed! - addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".sprintf(getMessage('CACHE_CANNOT_UNLINK'), $this->fqfn)); + reportBug(__METHOD__, __LINE__, '{%message,CACHE_CANNOT_UNLINK=' . $this->name . '%}'); } } // END - if } // Unused method: function removeEntry ($search, $data, $array) { - if ($this->status[$this->name] == $this->statusDone) { + if ($this->status[$this->name] == 'done') { // Load cache into dummy array $dummy = $this->getArrayFromCache(); @@ -318,10 +386,10 @@ class CacheSystem { // Close cache file $this->finalize(); - } + } // END - if } else { // Cannot write to cache! - addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".getMessage('CACHE_PROBLEMS_DETECTED')); + reportBug(__METHOD__, __LINE__, 'Problem with cache detected: Unexpected status ' . $this->status[$this->name]); } } @@ -331,27 +399,27 @@ class CacheSystem { 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 .= $this->rewriteEntry($k, $v2); - } + } // END - foreach } else { // Single line found $LINE = $this->rewriteEntry($k, $v); } // Write line(s) - fwrite($this->pointer, $LINE); + $this->writeLine($LINE); } // END - foreach } else { // Cannot write array! - addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".getMessage('CACHE_PROBLEMS_DETECTED')); + reportBug(__METHOD__, __LINE__, 'Problem with cache detected: pointer is not resource! pointer[]=' . gettype($this->pointer)); } } // Unused method function replaceEntry ($search, $replace, $search_key, $array) { - if ($this->status[$this->name] == $this->statusDone) { + if ($this->status[$this->name] == 'done') { // Load cache into dummy array $dummy = $this->getArrayFromCache(); @@ -359,7 +427,7 @@ class CacheSystem { 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) { @@ -382,7 +450,7 @@ class CacheSystem { } // END - if } else { // Cannot write to cache! - addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".getMessage('CACHE_PROBLEMS_DETECTED')); + reportBug(__METHOD__, __LINE__, 'Problem with cache detected: Unexpected status ' . $this->status[$this->name]); } } @@ -395,57 +463,65 @@ class CacheSystem { // Get extension version $ext_ver = getExtensionVersion($ext_name); - // Write cache line to file - fwrite($this->pointer, $this->rewriteEntry($ext_name, $ext_ver, 'version', true)); - // Add the extension version to object (DO NOT REMOVE IT! Endless loop...) $this->version[$this->name][$ext_name] = $ext_ver; + + // Write cache line to file + $this->writeLine($this->rewriteEntry($ext_name, $ext_ver, 'version', TRUE)); } // END - if - //* DEBUG: */ outputHtml(__METHOD__."(".__LINE__."): {$this->name} - {$ext_name}={$ext_ver}
"); + //* DEBUG: */ logDebugMessage(__METHOD__, __LINE__, 'name=' . $this->name . ',ext_name=' . $ext_name . ',ext_ver=' . $ext_ver); } else { // Cannot create file - addFatalMessage(__METHOD__, __LINE__, "(".__LINE__."): ".getMessage('CACHE_PROBLEMS_DETECTED')); + reportBug(__METHOD__, __LINE__, 'Problem with cache detected: pointer is not resource! pointer[]=' . gettype($this->pointer)); } } - // Checks wether versions from cache and extension matches + // Checks whether versions from cache and extension matches function extensionVersionMatches ($ext_name) { - // Default is not matching - $matches = false; - - // Compare only if installed - if (isExtensionInstalled($ext_name)) { - // Get extension version - $ext_ver = getExtensionVersion($ext_name); - - // Debug messages - if (isset($this->version[$this->name][$ext_name])) { - // Does it match? - $matches = ((isset($this->version[$this->name][$ext_name])) && ($this->version[$this->name][$ext_name] == $ext_ver)); - } elseif ($this->isCacheReadable()) { - // No cache version found! - logDebugMessage(__METHOD__, __LINE__, "Cache {$this->name} has missing version entry for extension {$ext_name}! Purging cache..."); - - // Remove the cache file - $this->removeCacheFile(false, true); + // Check cache + if (!isset($GLOBALS[__METHOD__][$ext_name])) { + // Does never match by default + $GLOBALS[__METHOD__][$ext_name] = FALSE; + + // Compare only if installed + if (isExtensionInstalled($ext_name)) { + // Get extension version + $ext_ver = getExtensionVersion($ext_name); + + // Debug messages + if (isset($this->version[$this->name][$ext_name])) { + // Does it match? + $GLOBALS[__METHOD__][$ext_name] = ((isset($this->version[$this->name][$ext_name])) && ($this->version[$this->name][$ext_name] == $ext_ver)); + } elseif ($this->isCacheReadable()) { + // No cache version found + logDebugMessage(__METHOD__, __LINE__, 'Cache ' . $this->name . ' has missing version entry for extension ' . $ext_name . '! Purging cache...'); + + // Remove the cache file + $this->removeCacheFile(TRUE); + } + } else { + // Not installed, does always match + $GLOBALS[__METHOD__][$ext_name] = TRUE; } } else { - // Not installed, does always match - $matches = true; + // Cache entry found, log debug message + //* DEBUG: */ logDebugMessage(__METHOD__, __LINE__, 'ext_name=' . $ext_name . ', matches=' . intval($GLOBALS[__METHOD__][$ext_name])); } // Compare both - return $matches; + return $GLOBALS[__METHOD__][$ext_name]; } // 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, $prefix = 'data', $single = false) { + function rewriteEntry ($key, $value, $prefix = 'data', $single = FALSE) { // Default is not single entry $extender = '[]'; // Add only for single array entry? - if ($single === true) $extender = ''; + if ($single === TRUE) { + $extender = ''; + } // END - if // Init line $line = ''; @@ -453,34 +529,42 @@ class CacheSystem { // String or non-string? ;-) if (is_string($value)) { // String... - $line = '$this->' . $prefix . "['".$this->name."']['" . $key . "']" . $extender . " = '" . smartAddSlashes($value) . "';\n"; + $line = '$this->' . $prefix . "['" . $this->name . "']['" . $key . "']" . $extender . " = '" . escapeQuotes($value) . "';"; } elseif (is_null($value)) { // Null - $line = '$this->' . $prefix . "['".$this->name."']['" . $key . "']" . $extender . " = null;\n"; + $line = '$this->' . $prefix . "['" . $this->name . "']['" . $key . "']" . $extender . ' = NULL;'; } elseif (is_bool($value)) { // Boolean value - if ($value === true) { + if ($value === TRUE) { // True - $line = '$this->' . $prefix . "['".$this->name."']['" . $key . "']" . $extender . " = true;\n"; + $line = '$this->' . $prefix . "['" . $this->name . "']['" . $key . "']" . $extender . ' = TRUE;'; } else { // False - $line = '$this->' . $prefix . "['".$this->name."']['" . $key . "']" . $extender . " = false;\n"; + $line = '$this->' . $prefix . "['" . $this->name . "']['" . $key . "']" . $extender . ' = FALSE;'; } + } elseif (isset($value[0])) { + // These lines needs fixing + reportBug(__METHOD__, __LINE__, 'Invalid entry with [0] found. key=' . $key); } else { // Non-string - $line = '$this->' . $prefix . "['".$this->name."']['" . $key . "']" . $extender . " = " . $value . ";\n"; + $line = '$this->' . $prefix . "['" . $this->name . "']['" . $key . "']" . $extender . ' = ' . $value . ';'; } // Return line return $line; } - // Getter for cache status - function getStatus () { - return $this->ret; + // Getter for cache status code + function getStatusCode () { + return $this->statusCode; } - // Checks wether the current cache file is readable + // Setter for cache status code + function setStatusCode ($status) { + $this->statusCode = $status; + } + + // Checks whether the current cache file is readable function isCacheReadable () { // Array entry found? if (!isset($this->readable[$this->name])) { @@ -492,6 +576,11 @@ class CacheSystem { return $this->readable[$this->name]; } + // Cloning not allowed + function __clone () { + // Please do not clone this class + reportBug(__METHOD__, __LINE__, 'Cloning of this class is not allowed.'); + } } // END - class // [EOF]