Feature #56036

Optimize autoloading

Added by Benjamin Heek over 1 year ago. Updated over 1 year ago.

Status:New Start date:2014-02-17
Priority:Should have Due date:
Assigned To:- % Done:

0%

Category:-
Target version:-
PHP Version: Complexity:
Has patch:No

Description

The TYPO3\Flow\Core\Autoloader is checking where to find a class every request.

It's much faster to store the founded path for a class in something like a `class path cache` variable.

It made my time per request go from 140ms to 70ms.

For Example:

  /**
       * @var \TYPO3\Flow\Cache\Frontend\PhpFrontend
       */
       protected $classesCache;

       public function __construct() {
               $this->classesPaths = apc_exists('classespaths') ? apc_fetch('classespaths') : array();
       }

       public function __destruct() {
               apc_store('classespaths', $this->classesPaths);
       }

       /**
       * Loads php files containing classes or interfaces found in the classes directory of
       * a package and specifically registered classes.
       *
       * @param string $className Name of the class/interface to load
       * @return boolean
       */
       public function loadClass($className) {
              if ($className[0] === '\\') {
                     $className = substr($className, 1);
              }
              if (isset($this->classesPaths[$className])) {
                     require($this->classesPaths[$className]);
                     return TRUE;
              }

              // Loads any known proxied class:
              if ($this->classesCache !== NULL && $this->classesCache->requireOnce(str_replace('\\', '_', $className)) !== FALSE) {
                     $this->classesPaths[$className] = $this->classesCache->getBackend()->getCacheDirectory() . str_replace('\\', '_', $className) . '.php';
                     return TRUE;
              }

History

#1 Updated by Rafael Kähm over 1 year ago

Hello Benjamin,

cool idea, but your example will crash multiple PHP-FPM pools, if they are started with single FPM.

If somebody needs that and uses multiple Flow setups with FPM pools, then each fpm-pool must be started separately.

Also:

php-fpm --daemonize -c /etc/php/fpm/php.ini --fpm-config /etc/php/fpm/php-firstSetup.conf
php-fpm --daemonize -c /etc/php/fpm/php.ini --fpm-config /etc/php/fpm/php-secondSetup.conf
...

#2 Updated by Kobbe van Daatselaar over 1 year ago

Hi Rafael,

what Benjamin tries to say is that caching the successfully loaded classes and using a require instead of a include causes a large performance improvement.

The way it should be cached can be discussed...

Also available in: Atom PDF