Caching of class content and developer mode added
authorRoland Häder <roland@mxchange.org>
Wed, 11 Jun 2008 20:42:37 +0000 (20:42 +0000)
committerRoland Häder <roland@mxchange.org>
Wed, 11 Jun 2008 20:42:37 +0000 (20:42 +0000)
inc/classes/interfaces/registry/class_Register.php
inc/classes/interfaces/registry/class_Registerable.php
inc/includes.php
inc/loader/class_ClassLoader.php
inc/selector.php
index.php

index e391b28..a750ac1 100644 (file)
@@ -47,3 +47,6 @@ interface Register extends FrameworkInterface {
         */
        function getInstance ($instanceKey);
 }
+
+// [EOF]
+?>
index c7a949a..dc603ca 100644 (file)
  * You should have received a copy of the GNU General Public License
  * along with this program. If not, see <http://www.gnu.org/licenses/>.
  */
+
+// 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
index a1b2e82..79e9f05 100644 (file)
  */
 class ClassLoader {
        /**
+        * Instance of this class
+        */
+       private static $selfInstance = null;
+
+       /**
         * Configuration array
         */
        private $cfg = array();
@@ -42,6 +47,11 @@ class ClassLoader {
        private $classes = array();
 
        /**
+        * List of loaded classes
+        */
+       private $loadedClasses = array();
+
+       /**
         * Suffix with extension for all class files
         */
        private $prefix = "class_";
@@ -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}<br />\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
        }
index 3397754..c737568 100644 (file)
  * along with this program. If not, see <http://www.gnu.org/licenses/>.
  */
 
-// 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')
                ));
        }
 }
index b133cc8..1a3a883 100644 (file)
--- a/index.php
+++ b/index.php
@@ -1,4 +1,7 @@
 <?php
+// Developer mode active? Comment out if no dev!
+define('DEVELOPER', true);
+
 //xdebug_start_trace();
 /**
  * The main class with the entry point to the whole application. This class