summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/autoloader.php55
-rw-r--r--lib/base.php6
2 files changed, 33 insertions, 28 deletions
diff --git a/lib/autoloader.php b/lib/autoloader.php
index b5b58918372..b0dc8904098 100644
--- a/lib/autoloader.php
+++ b/lib/autoloader.php
@@ -16,6 +16,12 @@ class Autoloader {
private $classPaths = array();
/**
+ * Optional low-latency memory cache for class to path mapping.
+ * @var \OC\Memcache\Cache
+ */
+ protected $memoryCache;
+
+ /**
* Add a custom prefix to the autoloader
*
* @param string $prefix
@@ -112,44 +118,39 @@ class Autoloader {
* @param string $class
* @return bool
*/
- protected $memoryCache = null;
- protected $constructingMemoryCache = true; // hack to prevent recursion
public function load($class) {
- // Does this PHP have an in-memory cache? We cache the paths there
- if ($this->constructingMemoryCache && !$this->memoryCache) {
- $this->constructingMemoryCache = false;
- try {
- $this->memoryCache = \OC\Memcache\Factory::createLowLatency('Autoloader');
- } catch(\Exception $ex) {
- // no caching then - fine with me
- }
- }
+ $pathsToRequire = null;
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)) {
+ if (!is_array($pathsToRequire)) {
+ // No cache or cache miss
$pathsToRequire = array();
- foreach ($paths as $path) {
- if ($fullPath = stream_resolve_include_path($path)) {
- require_once $fullPath;
+ foreach ($this->findClass($class) as $path) {
+ $fullPath = stream_resolve_include_path($path);
+ if ($fullPath) {
$pathsToRequire[] = $fullPath;
}
}
+ }
- // Save in our memory cache
- if ($this->memoryCache) {
- $this->memoryCache->set($class, $pathsToRequire, 60); // cache 60 sec
- }
+ if ($this->memoryCache) {
+ $this->memoryCache->set($class, $pathsToRequire, 60); // cache 60 sec
+ }
+
+ foreach ($pathsToRequire as $fullPath) {
+ require_once $fullPath;
}
+
return false;
}
+
+ /**
+ * @brief Sets the optional low-latency cache for class to path mapping.
+ * @param \OC\Memcache\Cache $memoryCache Instance of memory cache.
+ */
+ public function setMemoryCache(\OC\Memcache\Cache $memoryCache) {
+ $this->memoryCache = $memoryCache;
+ }
}
diff --git a/lib/base.php b/lib/base.php
index ef574b2d895..53ea28b46b4 100644
--- a/lib/base.php
+++ b/lib/base.php
@@ -371,6 +371,11 @@ class OC {
// register autoloader
require_once __DIR__ . '/autoloader.php';
self::$loader = new \OC\Autoloader();
+ spl_autoload_register(array(self::$loader, 'load'));
+ try {
+ self::$loader->setMemoryCache(\OC\Memcache\Factory::createLowLatency('Autoloader'));
+ } catch(\Exception $ex) {
+ }
self::$loader->registerPrefix('Doctrine\\Common', 'doctrine/common/lib');
self::$loader->registerPrefix('Doctrine\\DBAL', 'doctrine/dbal/lib');
self::$loader->registerPrefix('Symfony\\Component\\Routing', 'symfony/routing');
@@ -378,7 +383,6 @@ class OC {
self::$loader->registerPrefix('Sabre\\VObject', '3rdparty');
self::$loader->registerPrefix('Sabre_', '3rdparty');
self::$loader->registerPrefix('Patchwork', '3rdparty');
- spl_autoload_register(array(self::$loader, 'load'));
// set some stuff
//ob_start();