Browse Source

Class Auto Loader: Cache paths in APC

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).
tags/v6.0.0alpha2
Markus Goetz 10 years ago
parent
commit
aba64a0b81
2 changed files with 54 additions and 1 deletions
  1. 25
    1
      lib/autoloader.php
  2. 29
    0
      lib/memcache/factory.php

+ 25
- 1
lib/autoloader.php View 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;
}

+ 29
- 0
lib/memcache/factory.php View 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();
}


}

Loading…
Cancel
Save