diff --git a/core/lib/Drupal/Core/DrupalKernel.php b/core/lib/Drupal/Core/DrupalKernel.php index 0e679fd..f3b7d59 100644 --- a/core/lib/Drupal/Core/DrupalKernel.php +++ b/core/lib/Drupal/Core/DrupalKernel.php @@ -216,6 +216,7 @@ public static function createFromRequest(Request $request, $class_loader, $envir // Include our bootstrap file. $core_root = dirname(dirname(dirname(__DIR__))); require_once $core_root . '/includes/bootstrap.inc'; + $class_loader_class = get_class($class_loader); $kernel = new static($environment, $class_loader, $allow_dumping); @@ -244,6 +245,18 @@ public static function createFromRequest(Request $request, $class_loader, $envir $response->prepare($request)->send(); } + // If the class loader is still the same, possibly upgrade to the APCu class loader. + if ($class_loader_class == get_class($class_loader) + && Settings::get('class_loader_auto_detect', TRUE) + && Settings::get('hash_salt', FALSE) + && extension_loaded('apcu') + && function_exists('apc_fetch')) { + $apc_loader = new \Symfony\Component\ClassLoader\ApcClassLoader('drupal.' . Settings::get('hash_salt'), $class_loader); + $class_loader->unregister(); + $apc_loader->register(); + $class_loader = $apc_loader; + } + return $kernel; } diff --git a/core/rebuild.php b/core/rebuild.php index 7ca8af7..36da7e2 100644 --- a/core/rebuild.php +++ b/core/rebuild.php @@ -20,6 +20,11 @@ // Change the directory to the Drupal root. chdir('..'); +// Clear the APCu cache to ensure APC classloader is reset. +if (extension_loaded('apcu') && function_exists('apc_fetch')) { + apc_clear_cache(); +} + $autoloader = require_once __DIR__ . '/vendor/autoload.php'; require_once __DIR__ . '/includes/utility.inc'; diff --git a/sites/default/default.settings.php b/sites/default/default.settings.php index d5d8704..014816a 100644 --- a/sites/default/default.settings.php +++ b/sites/default/default.settings.php @@ -379,7 +379,12 @@ * To do so, you may decorate and replace the local $class_loader variable. * * For example, to use Symfony's APC class loader, uncomment the code below. + * + * The Symfony APC class loader is used by default when the APCu extension is detected. + * You can disable this detection by setting 'class_loader_auto_detect' => FALSE. */ +# $settings['class_loader_auto_detect'] = FALSE; + /* if ($settings['hash_salt']) { $apc_loader = new \Symfony\Component\ClassLoader\ApcClassLoader('drupal.' . $settings['hash_salt'], $class_loader);