diff --git a/phpBB/install/startup.php b/phpBB/install/startup.php
index 50758f5b98..007b20da35 100644
--- a/phpBB/install/startup.php
+++ b/phpBB/install/startup.php
@@ -85,13 +85,7 @@ function installer_msg_handler($errno, $msg_text, $errfile, $errline)
return;
break;
case E_USER_ERROR:
- $msg = 'General Error:
' . $msg_text . '
in file ' . $errfile . ' on line ' . $errline;
-
- $backtrace = get_backtrace();
- if ($backtrace)
- {
- $msg .= '
BACKTRACE
' . $backtrace;
- }
+ $msg = 'General Error:
' . $msg_text . '
in file ' . $errfile . ' on line ' . $errline . '
';
throw new \phpbb\exception\runtime_exception($msg);
break;
@@ -103,17 +97,129 @@ function installer_msg_handler($errno, $msg_text, $errfile, $errline)
return false;
}
+/**
+ * Register class loaders for installer
+ *
+ * @param string $phpbb_root_path phpBB root path
+ * @param string $phpEx PHP file extension
+ */
+function installer_class_loader($phpbb_root_path, $phpEx)
+{
+ $phpbb_class_loader_new = new \phpbb\class_loader('phpbb\\', "{$phpbb_root_path}install/update/new/phpbb/", $phpEx);
+ $phpbb_class_loader_new->register();
+ $phpbb_class_loader = new \phpbb\class_loader('phpbb\\', "{$phpbb_root_path}phpbb/", $phpEx);
+ $phpbb_class_loader->register();
+ $phpbb_class_loader = new \phpbb\class_loader('phpbb\\convert\\', "{$phpbb_root_path}install/convert/", $phpEx);
+ $phpbb_class_loader->register();
+ $phpbb_class_loader_ext = new \phpbb\class_loader('\\', "{$phpbb_root_path}ext/", $phpEx);
+ $phpbb_class_loader_ext->register();
+}
+
+/**
+ * Installer shutdown function. Tries to resolve errors that might have occured
+ * during execution of installer
+ *
+ * @param int $display_errors Original display errors value
+ */
+function installer_shutdown_function($display_errors)
+{
+ $error = error_get_last();
+
+ if ($error)
+ {
+ // Restore original display errors value
+ @ini_set('display_errors', $display_errors);
+
+ // Manually define phpBB root path and phpEx. These will not be passed
+ // on from app.php
+ $phpbb_root_path = __DIR__ . '/../';
+ $phpEx = 'php';
+
+ installer_class_loader($phpbb_root_path, $phpEx);
+ $supported_error_levels = E_ALL & ~E_NOTICE & ~E_DEPRECATED & ~E_USER_DEPRECATED;
+
+ $cache = new \phpbb\cache\driver\file(__DIR__ . '/../cache/installer');
+ $filesystem = new \phpbb\filesystem\filesystem();
+ if (strpos($error['file'], $filesystem->realpath($cache->cache_dir)) !== false)
+ {
+ $file_age = @filemtime($error['file']);
+
+ if ($file_age !== false && ($file_age + 60) < time())
+ {
+ $cache->purge();
+
+ $symfony_request = new \phpbb\symfony_request(new \phpbb\request\request(new \phpbb\request\type_cast_helper()));
+
+ header('Location: ' . $symfony_request->getRequestUri());
+ exit();
+ }
+ else
+ {
+ // Language system is not available
+ die('The installer has detected an issue with a cached file. Try reloading the page and/or manually clearing the cache to resolve the issue. If you require further assistance, please visit the phpBB support forums.');
+ }
+ }
+ else if ($error['type'] & $supported_error_levels)
+ {
+ // Convert core errors to user warnings for trigger_error()
+ if ($error['type'] == E_CORE_ERROR || $error['type'] == E_COMPILE_ERROR)
+ {
+ $error['type'] = E_USER_ERROR;
+ }
+ else if ($error['type'] == E_CORE_WARNING)
+ {
+ $error['type'] = E_USER_WARNING;
+ }
+
+ try
+ {
+ installer_msg_handler($error['type'], $error['message'], $error['file'], $error['line']);
+ }
+ catch (\phpbb\exception\runtime_exception $exception)
+ {
+ echo '';
+ echo '';
+ echo '