From: Roland Häder Date: Wed, 11 Jun 2008 20:42:37 +0000 (+0000) Subject: Caching of class content and developer mode added X-Git-Url: https://git.mxchange.org/?p=shipsimu.git;a=commitdiff_plain;h=ca005df6eb0608fa12b23382b8ae8d1b526da4af Caching of class content and developer mode added --- diff --git a/inc/classes/interfaces/registry/class_Register.php b/inc/classes/interfaces/registry/class_Register.php index e391b28..a750ac1 100644 --- a/inc/classes/interfaces/registry/class_Register.php +++ b/inc/classes/interfaces/registry/class_Register.php @@ -47,3 +47,6 @@ interface Register extends FrameworkInterface { */ function getInstance ($instanceKey); } + +// [EOF] +?> diff --git a/inc/classes/interfaces/registry/class_Registerable.php b/inc/classes/interfaces/registry/class_Registerable.php index f1d60f2..0616d00 100644 --- a/inc/classes/interfaces/registry/class_Registerable.php +++ b/inc/classes/interfaces/registry/class_Registerable.php @@ -24,5 +24,5 @@ interface Registerable extends FrameworkInterface { } -// +// [EOF] ?> diff --git a/inc/includes.php b/inc/includes.php index c7a949a..dc603ca 100644 --- a/inc/includes.php +++ b/inc/includes.php @@ -21,8 +21,41 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ + +// Get config instance +$cfg = FrameworkConfiguration::getInstance(); + // Include the class loader function -require(sprintf("%sinc/loader/class_ClassLoader%s", PATH, FrameworkConfiguration::getInstance()->readConfig('php_extension'))); +require(sprintf("%sinc/loader/class_ClassLoader%s", PATH, $cfg->readConfig('php_extension'))); + +// Does the user has an application specified? +if (!empty($_GET[$cfg->readConfig('app_selector_get')])) { + // Set the application from string + $application = (string) $_GET[$cfg->readConfig('app_selector_get')]; +} elseif (!empty($_SERVER['argv'][1])) { + // Set the application from string + $application = (string) $_SERVER['argv'][1]; + $app = explode('=', trim($application)); + if ($app[0] == $cfg->readConfig('app_selector_get')) { + // Application is valid! + $application = trim($app[1]); + } else { + // Invalid entry found, first must be "app"! + $application = $cfg->readConfig('default_application'); + } +} else { + // Set the "application selector" application + $application = $cfg->readConfig('default_application'); +} + +// Secure it, by keeping out tags +$application = htmlentities(strip_tags($application), ENT_QUOTES); + +// Secure it a little more with a reg.exp. +$application = preg_replace('/([^a-z_-])+/i', "", $application); + +// Set the application name for later usage +$cfg->setConfigEntry('app_name', $application); /** * Autoload-function diff --git a/inc/loader/class_ClassLoader.php b/inc/loader/class_ClassLoader.php index a1b2e82..79e9f05 100644 --- a/inc/loader/class_ClassLoader.php +++ b/inc/loader/class_ClassLoader.php @@ -31,6 +31,11 @@ * ---------------------------------- */ class ClassLoader { + /** + * Instance of this class + */ + private static $selfInstance = null; + /** * Configuration array */ @@ -41,6 +46,11 @@ class ClassLoader { */ private $classes = array(); + /** + * List of loaded classes + */ + private $loadedClasses = array(); + /** * Suffix with extension for all class files */ @@ -73,9 +83,24 @@ class ClassLoader { private $debug = false; /** - * Instance of this class + * Wether the file list is cached or not */ - private static $selfInstance = null; + private $listCached = false; + + /** + * Wethe class content has been cached + */ + private $classesCached = false; + + /** + * Filename for the list cache + */ + private $listCacheFQFN = ""; + + /** + * Cache for class content + */ + private $classCacheFQFN = ""; /** * The *public* constructor @@ -84,6 +109,15 @@ class ClassLoader { * @return void */ public function __construct (FrameworkConfiguration $cfgInstance) { + // Set configuration instance + $this->cfgInstance = $cfgInstance; + + // Construct the FQFN for the cache + if (!defined('DEVELOPER')) { + $this->listCacheFQFN = PATH . $this->cfgInstance->readConfig('local_db_path') . "list-" . $this->cfgInstance->readConfig('app_name') . ".cache"; + $this->classCacheFQFN = PATH . $this->cfgInstance->readConfig('local_db_path') . "class-" . $this->cfgInstance->readConfig('app_name') . ".cache"; + } // END - if + // Set suffix and prefix from configuration $this->suffix = $cfgInstance->readConfig('class_suffix'); $this->prefix = $cfgInstance->readConfig('class_prefix'); @@ -92,11 +126,62 @@ class ClassLoader { $this->suffixLen = strlen($this->suffix); $this->prefixLen = strlen($this->prefix); - // Set configuration instance - $this->cfgInstance = $cfgInstance; - // Set own instance self::$selfInstance = $this; + + // Skip here if no dev-mode + if (defined('DEVELOPER')) return; + + // IS the cache there? + if (file_exists($this->listCacheFQFN)) { + // Get content + $cacheContent = file_get_contents($this->listCacheFQFN); + + // And convert it + $this->classes = unserialize($cacheContent); + + // List has been restored from cache! + $this->listCached = true; + } // END - if + + // Does the class cache exist? + if (file_exists($this->classCacheFQFN)) { + // Then include it + require($this->classCacheFQFN); + + // Mark the class cache as loaded + $this->classesCached = true; + } // END - if + } + + /** + * The destructor makes it sure all caches got flushed + * + * @return void + */ + public function __destruct () { + // Skip here if dev-mode + if (defined('DEVELOPER')) return; + + // Skip here if already cached + if ($this->listCached === false) { + // Writes the cache file of our list away + $cacheContent = serialize($this->classes); + file_put_contents($this->listCacheFQFN, $cacheContent); + } // END - if + + // Skip here if already cached + if ($this->classesCached === false) { + // Generate a full-cache of all classes + $cacheContent = ""; + foreach ($this->loadedClasses as $fqfn) { + // Load the file + $cacheContent .= file_get_contents($fqfn); + } // END - foreach + + // And write it away + file_put_contents($this->classCacheFQFN, $cacheContent); + } // END - if } /** @@ -123,6 +208,12 @@ class ClassLoader { * @return void */ public function loadClasses ($basePath, $ignoreList = array() ) { + // Is a list has been restored from cache, don't read it again + if ($this->listCached === true) { + // Abort here + return; + } + // Convert string to array if (!is_array($ignoreList)) $ignoreList = array($ignoreList); @@ -166,8 +257,8 @@ class ClassLoader { $fqfn = $entry->getRealPath(); //* DEBUG: */ echo "ADD: {$fileName}
\n"; $this->classes[$fileName] = $fqfn; - } - } + } // END - if + } // END - foreach } /** @@ -208,12 +299,16 @@ class ClassLoader { // Now look it up in our index if (isset($this->classes[$fileName])) { - if ($this->classes[$fileName] != "loaded") { - // File is found so load it only once - require($this->classes[$fileName]); + // File is found so load it only once + require($this->classes[$fileName]); + + // Developer mode excludes caching (better debugging) + if (!defined('DEVELOPER')) { + // Mark this class as loaded + $this->loadedClasses[] = $this->classes[$fileName]; - // Mark it as loaded - $this->classes[$fileName] = "loaded"; + // Reset cache + $this->classesCached = false; } // END - if } // END - if } diff --git a/inc/selector.php b/inc/selector.php index 3397754..c737568 100644 --- a/inc/selector.php +++ b/inc/selector.php @@ -22,35 +22,12 @@ * along with this program. If not, see . */ -// Does the user has an application specified? -if (!empty($_GET[FrameworkConfiguration::getInstance()->readConfig('app_selector_get')])) { - // Set the application from string - $application = (string) $_GET[FrameworkConfiguration::getInstance()->readConfig('app_selector_get')]; -} elseif (!empty($_SERVER['argv'][1])) { - // Set the application from string - $application = (string) $_SERVER['argv'][1]; - $app = explode('=', trim($application)); - if ($app[0] == FrameworkConfiguration::getInstance()->readConfig('app_selector_get')) { - // Application is valid! - $application = trim($app[1]); - } else { - // Invalid entry found, first must be "app"! - $application = FrameworkConfiguration::getInstance()->readConfig('default_application'); - } -} else { - // Set the "application selector" application - $application = FrameworkConfiguration::getInstance()->readConfig('default_application'); -} - -// Secure it, by keeping out tags -$application = htmlentities(strip_tags($application), ENT_QUOTES); - -// Secure it a little more with a reg.exp. -$application = preg_replace('/([^a-z_-])+/i', "", $application); +// Get config instance +$cfg = FrameworkConfiguration::getInstance(); // Try to load these includes in the given order $configAppIncludes = array( - sprintf("class_%s", FrameworkConfiguration::getInstance()->readConfig('app_helper_class')), // The ApplicationHelper class + sprintf("class_%s", $cfg->readConfig('app_helper_class')), // The ApplicationHelper class "config", // The application's own configuration "init", // The application initializer "loader", // The application's class loader @@ -70,20 +47,20 @@ foreach ($configAppIncludes as $inc) { // Generate a FQFN for the helper class $fqfn = sprintf("%s%s/%s/%s%s", PATH, - FrameworkConfiguration::getInstance()->readConfig('application_path'), - $application, + $cfg->readConfig('application_path'), + $cfg->readConfig('app_name'), $inc, - FrameworkConfiguration::getInstance()->readConfig('php_extension') + $cfg->readConfig('php_extension') ); // Does the include file exists? if ((file_exists($fqfn)) && (is_file($fqfn)) && (is_readable($fqfn))) { // Load it require_once($fqfn); - } elseif (FrameworkConfiguration::getInstance()->readConfig('verbose_level') > 0) { + } elseif ($cfg->readConfig('verbose_level') > 0) { // File is missing trigger_error(sprintf("Cannot load application script %s! File is missing or read-protected.", - $inc . FrameworkConfiguration::getInstance()->readConfig('php_extension') + $inc . $cfg->readConfig('php_extension') )); } } diff --git a/index.php b/index.php index b133cc8..1a3a883 100644 --- a/index.php +++ b/index.php @@ -1,4 +1,7 @@