From be97f50fba4c7c87b4332d30cf8e0f612b89bdb5 Mon Sep 17 00:00:00 2001 From: David Rothstein Date: Mon, 30 Mar 2015 00:46:00 -0400 Subject: Issue #779482 by mikeytown2, sun, dalin, cam8001, segi, alexpott, Boobaa, Sweetchuck, jbrown, quicksketch: Installation failure when opcode cache is enabled --- includes/bootstrap.inc | 31 +++++++++++++++++++++++++++++++ includes/install.inc | 7 +++++++ 2 files changed, 38 insertions(+) (limited to 'includes') diff --git a/includes/bootstrap.inc b/includes/bootstrap.inc index 6a0ff7bc9..ac6fb143f 100644 --- a/includes/bootstrap.inc +++ b/includes/bootstrap.inc @@ -3511,3 +3511,34 @@ function drupal_check_memory_limit($required, $memory_limit = NULL) { // - The memory limit is greater than the memory required for the operation. return ((!$memory_limit) || ($memory_limit == -1) || (parse_size($memory_limit) >= parse_size($required))); } + +/** + * Invalidates a PHP file from any active opcode caches. + * + * If the opcode cache does not support the invalidation of individual files, + * the entire cache will be flushed. + * + * @param string $filepath + * The absolute path of the PHP file to invalidate. + */ +function drupal_clear_opcode_cache($filepath) { + if (!defined('PHP_VERSION_ID') || PHP_VERSION_ID < 50300) { + // Below PHP 5.3, clearstatcache does not accept any function parameters. + clearstatcache(); + } + else { + clearstatcache(TRUE, $filepath); + } + + // Zend OPcache. + if (function_exists('opcache_invalidate')) { + opcache_invalidate($filepath, TRUE); + } + // APC. + if (function_exists('apc_delete_file')) { + // apc_delete_file() throws a PHP warning in case the specified file was + // not compiled yet. + // @see http://php.net/apc-delete-file + @apc_delete_file($filepath); + } +} diff --git a/includes/install.inc b/includes/install.inc index f13ee8ac2..2b55589f8 100644 --- a/includes/install.inc +++ b/includes/install.inc @@ -653,6 +653,13 @@ function drupal_rewrite_settings($settings = array(), $prefix = '') { if ($fp && fwrite($fp, $buffer) === FALSE) { throw new Exception(st('Failed to modify %settings. Verify the file permissions.', array('%settings' => $settings_file))); } + else { + // The existing settings.php file might have been included already. In + // case an opcode cache is enabled, the rewritten contents of the file + // will not be reflected in this process. Ensure to invalidate the file + // in case an opcode cache is enabled. + drupal_clear_opcode_cache(DRUPAL_ROOT . '/' . $settings_file); + } } else { throw new Exception(st('Failed to open %settings. Verify the file permissions.', array('%settings' => $default_settings))); -- cgit v1.2.3