[BUGFIX] Cache healing for classes loaded via ext_autoload 28/39928/5
authorBernhard Kraft <kraft@webconsulting.at>
Tue, 2 Jun 2015 14:43:38 +0000 (16:43 +0200)
committerMarkus Klein <markus.klein@typo3.org>
Thu, 20 Aug 2015 15:42:44 +0000 (17:42 +0200)
Currently classes loaded via an ext_autoload.php will get their cache
generated only after clearing all caches using the install tool "Clear
all caches" button or the red clear cache icon. This patch improves the
situation by taking care of ext_autoload.php files also during normal
processing. There can be edge cases where the classes_cache will not get
properly generated. In such a situation a missing cache entry will cause
"class not found" errors.

There is no performance impact for Production systems (TYPO3_CONTEXT) as
the result of the class lookup will get cached anyways. If a class is
not found via the existing mechanisms or in an ext_autoload.php it will
get cached as "invalid". Of course the class could get loaded by some
other autoload handler afterwards.

Change-Id: Id996139d31f16c6bcb40f286fbf266a87147852d
Resolves: #67246
Releases: 6.2
Reviewed-on: http://review.typo3.org/39928
Reviewed-by: Helmut Hummel <helmut.hummel@typo3.org>
Reviewed-by: Markus Sommer <markussom@posteo.de>
Reviewed-by: Markus Klein <markus.klein@typo3.org>
Tested-by: Markus Klein <markus.klein@typo3.org>
typo3/sysext/core/Classes/Core/ClassLoader.php

index 87a5c3a..5f92d58 100644 (file)
@@ -296,6 +296,25 @@ class ClassLoader {
                        $classLoadingInformation = $this->buildClassLoadingInformationForClassByNamingConvention($className);
                }
 
+               if ($classLoadingInformation === FALSE) {
+                       // As a last resort try to load the class file from the autoload registry.
+                       // If this also fails the class will get cached as "unavailable" anyways
+                       // (if TYPO3_CONTEXT is Production) and there will be no performance impact.
+                       //
+                       // On non-production systems this case will generate an error (if not any later
+                       // spl_autoload handler makes the class available) and countermeasures will
+                       // have to be taken.
+                       //
+                       // So there will only be a performance impact for non-production systems, where
+                       // a class is requested which is made available by an spl_autoload handler
+                       // being run after the TYPO3 autoloader.
+                       //
+                       // The reason for this whole block is reasoned by not being able to determine
+                       // whether the classes cache has been built up properly or not.
+                       $this->loadClassFilesFromAutoloadRegistryIntoRuntimeClassInformationCache($this->packages);
+                       $classLoadingInformation = $this->fetchClassLoadingInformationFromRuntimeCache($className);
+               }
+
                return $classLoadingInformation;
        }