]> source.dussan.org Git - nextcloud-server.git/commitdiff
Class Auto Loader: Cache paths in APC
authorMarkus Goetz <markus@woboq.com>
Sat, 17 Aug 2013 14:01:37 +0000 (16:01 +0200)
committerMarkus Goetz <markus@woboq.com>
Sun, 18 Aug 2013 10:29:43 +0000 (12:29 +0200)
Using benchmark_single.php (from administration repo) I can
measure a speed improvement of 5% to 20% loading the /index.php
when logged in. (when using APC and php-fpm).

lib/autoloader.php
lib/memcache/factory.php

index 21170639092029561eefb9e9aa0212d5202bb09d..01841f831becb72a546c8787ce2400cc9d9c2b2f 100644 (file)
@@ -111,15 +111,39 @@ class Autoloader {
         * @param string $class
         * @return bool
         */
+       protected $memoryCache = null;
+       protected $constructingMemoryCache = true; // hack to prevent recursion
        public function load($class) {
-               $paths = $this->findClass($class);
+               // Does this PHP have an in-memory cache? We cache the paths there
+               if ($this->constructingMemoryCache && !$this->memoryCache) {
+                       $this->constructingMemoryCache = false;
+                       $this->memoryCache = \OC\Memcache\Factory::createLowLatency('Autoloader');
+               }
+               if ($this->memoryCache) {
+                       $pathsToRequire = $this->memoryCache->get($class);
+                       if (is_array($pathsToRequire)) {
+                               foreach ($pathsToRequire as $path) {
+                                       require_once $path;
+                               }
+                               return false;
+                       }
+               }
 
+               // Use the normal class loading path
+               $paths = $this->findClass($class);
                if (is_array($paths)) {
+                       $pathsToRequire = array();
                        foreach ($paths as $path) {
                                if ($fullPath = stream_resolve_include_path($path)) {
                                        require_once $fullPath;
+                                       $pathsToRequire[] = $fullPath;
                                }
                        }
+
+                       // Save in our memory cache
+                       if ($this->memoryCache) {
+                               $this->memoryCache->set($class, $pathsToRequire, 60); // cache 60 sec
+                       }
                }
                return false;
        }
index 4c1b1ab207f228cbb5bb7a1774d2820733b0c6ad..fde7d94756731662ef562099ecbd6bc6836c5b04 100644 (file)
@@ -37,4 +37,33 @@ class Factory {
        public function isAvailable() {
                return XCache::isAvailable() || APCu::isAvailable() || APC::isAvailable() || Memcached::isAvailable();
        }
+
+       /**
+        * get a in-server cache instance, will return null if no backend is available
+        *
+        * @param string $prefix
+        * @return \OC\Memcache\Cache
+        */
+       public static function createLowLatency($prefix = '') {
+               if (XCache::isAvailable()) {
+                       return new XCache($prefix);
+               } elseif (APCu::isAvailable()) {
+                       return new APCu($prefix);
+               } elseif (APC::isAvailable()) {
+                       return new APC($prefix);
+               } else {
+                       return null;
+               }
+       }
+
+       /**
+        * check if there is a in-server backend available
+        *
+        * @return bool
+        */
+       public static function isAvailableLowLatency() {
+               return XCache::isAvailable() || APCu::isAvailable() || APC::isAvailable();
+       }
+
+
 }