1
0
mirror of https://github.com/phpbb/phpbb.git synced 2025-08-14 04:34:07 +02:00

[ticket/14462] Further speed improvements

- Cache the secondary container
- Only initialize tasks/modules that are being used
- Add timeout error message in the AJAX UI

PHPBB3-14462
This commit is contained in:
Mate Bartus
2016-02-11 13:18:30 +01:00
parent 0210a6298d
commit 955b9ede33
26 changed files with 240 additions and 180 deletions

View File

@@ -95,8 +95,9 @@ class config
$this->installer_config = array();
$this->system_data = array();
$this->progress_data = array(
'last_task_module_name' => '', // Stores the service name of the latest finished module
'last_task_name' => '', // Stores the service name of the latest finished task
'last_task_module_neme' => '', // Stores the service name of the latest finished module
'last_task_module_index' => 0, // Stores the index of the latest finished module
'last_task_index' => 0, // Stores the index of the latest finished task
'max_task_progress' => 0,
'current_task_progress' => 0,
'_restart_points' => array(),
@@ -187,21 +188,23 @@ class config
/**
* Saves the latest executed task
*
* @param string $task_service_name Name of the installer task service
* @param int $task_service_index Index of the installer task service in the module
*/
public function set_finished_task($task_service_name)
public function set_finished_task($task_service_index)
{
$this->progress_data['last_task_name'] = $task_service_name;
$this->progress_data['last_task_index'] = $task_service_index;
}
/**
* Set active module
*
* @param string $module_service_name Name of the installer module service
* @param int $module_service_index Index of the installer module service
*/
public function set_active_module($module_service_name)
public function set_active_module($module_service_name, $module_service_index)
{
$this->progress_data['last_task_module_name'] = $module_service_name;
$this->progress_data['last_task_module_index'] = $module_service_index;
}
/**
@@ -391,6 +394,11 @@ class config
*/
public function set_finished_navigation_stage($nav_path)
{
if (isset($this->navigation_data['finished']) && in_array($nav_path, $this->navigation_data['finished']))
{
return;
}
$this->navigation_data['finished'][] = $nav_path;
}

View File

@@ -13,7 +13,6 @@
namespace phpbb\install\helper;
use phpbb\cache\driver\dummy;
use phpbb\install\exception\cannot_build_container_exception;
use phpbb\language\language;
use phpbb\request\request;
@@ -157,25 +156,20 @@ class container_factory
->with_environment('production')
->with_config($phpbb_config_php_file)
->with_config_path($config_path)
->without_cache()
->without_compiled_container()
->get_container();
// Setting request is required for the compatibility globals as those are generated from
// this container
$this->container->register('request')->setSynthetic(true);
$this->container->set('request', $this->request);
$this->container->register('language')->setSynthetic(true);
$this->container->set('language', $this->language);
// Replace cache service, as config gets cached, and we don't want that when we are installing
if (!is_dir($other_config_path))
if (!$this->container->isFrozen())
{
$this->container->register('cache.driver')->setSynthetic(true);
$this->container->set('cache.driver', new dummy());
$this->container->register('request')->setSynthetic(true);
$this->container->register('language')->setSynthetic(true);
}
$this->container->set('request', $this->request);
$this->container->set('language', $this->language);
$this->container->compile();
$phpbb_container = $this->container;

View File

@@ -209,9 +209,15 @@ class ajax_iohandler extends iohandler_base
/**
* {@inheritdoc}
*/
public function send_response()
public function send_response($no_more_output = false)
{
$json_data_array = $this->prepare_json_array();
$json_data_array = $this->prepare_json_array($no_more_output);
if (empty($json_data_array))
{
return;
}
$json_data = json_encode($json_data_array);
// Try to push content to the browser
@@ -223,23 +229,43 @@ class ajax_iohandler extends iohandler_base
/**
* Prepares iohandler's data to be sent out to the client.
*
* @param bool $no_more_output Whether or not there will be more output in this response
*
* @return array
*/
protected function prepare_json_array()
protected function prepare_json_array($no_more_output = false)
{
$json_array = array(
'errors' => $this->errors,
'warnings' => $this->warnings,
'logs' => $this->logs,
'success' => $this->success,
'download' => $this->download,
);
$json_array = array();
$this->errors = array();
$this->warnings = array();
$this->logs = array();
$this->success = array();
$this->download = array();
if (!empty($this->errors))
{
$json_array['errors'] = $this->errors;
$this->errors = array();
}
if (!empty($this->warnings))
{
$json_array['warnings'] = $this->warnings;
$this->warnings = array();
}
if (!empty($this->logs))
{
$json_array['logs'] = $this->logs;
$this->logs = array();
}
if (!empty($this->success))
{
$json_array['success'] = $this->success;
$this->success = array();
}
if (!empty($this->download))
{
$json_array['download'] = $this->download;
$this->download = array();
}
if (!empty($this->form))
{
@@ -293,6 +319,11 @@ class ajax_iohandler extends iohandler_base
$this->redirect_url = array();
}
if ($no_more_output)
{
$json_array['over'] = true;
}
return $json_array;
}
@@ -398,7 +429,7 @@ class ajax_iohandler extends iohandler_base
public function redirect($url, $use_ajax = false)
{
$this->redirect_url = array('url' => $url, 'use_ajax' => $use_ajax);
$this->send_response();
$this->send_response(true);
}
/**

View File

@@ -114,7 +114,7 @@ class cli_iohandler extends iohandler_base
/**
* {@inheritdoc}
*/
public function send_response()
public function send_response($no_more_output = false)
{
}

View File

@@ -20,8 +20,10 @@ interface iohandler_interface
{
/**
* Renders or returns response message
*
* @param bool $no_more_output Whether or not there will be more output in this output unit
*/
public function send_response();
public function send_response($no_more_output = false);
/**
* Returns input variable

View File

@@ -15,11 +15,13 @@ namespace phpbb\install;
use phpbb\cache\driver\driver_interface;
use phpbb\di\ordered_service_collection;
use phpbb\install\exception\cannot_build_container_exception;
use phpbb\install\exception\installer_config_not_writable_exception;
use phpbb\install\exception\jump_to_restart_point_exception;
use phpbb\install\exception\resource_limit_reached_exception;
use phpbb\install\exception\user_interaction_required_exception;
use phpbb\install\helper\config;
use phpbb\install\helper\container_factory;
use phpbb\install\helper\iohandler\cli_iohandler;
use phpbb\install\helper\iohandler\iohandler_interface;
use phpbb\path_helper;
@@ -31,13 +33,18 @@ class installer
*/
protected $cache;
/**
* @var container_factory
*/
protected $container_factory;
/**
* @var config
*/
protected $install_config;
/**
* @var array
* @var ordered_service_collection
*/
protected $installer_modules;
@@ -58,19 +65,27 @@ class installer
*/
protected $module_step_count;
/**
* @var bool
*/
protected $purge_cache_before;
/**
* Constructor
*
* @param driver_interface $cache Cache service
* @param config $config Installer config handler
* @param path_helper $path_helper Path helper
* @param container_factory $container Container
*/
public function __construct(driver_interface $cache, config $config, path_helper $path_helper)
public function __construct(driver_interface $cache, config $config, path_helper $path_helper, container_factory $container)
{
$this->cache = $cache;
$this->install_config = $config;
$this->container_factory = $container;
$this->installer_modules = null;
$this->web_root = $path_helper->get_web_root_path();
$this->purge_cache_before = false;
}
/**
@@ -96,6 +111,16 @@ class installer
$this->iohandler = $iohandler;
}
/**
* Sets whether to purge cache before the installation process
*
* @param bool $purge_cache_before
*/
public function set_purge_cache_before($purge_cache_before)
{
$this->purge_cache_before = $purge_cache_before;
}
/**
* Run phpBB installer
*/
@@ -104,9 +129,16 @@ class installer
// Load install progress
$this->install_config->load_config();
if (!$this->install_config->get('cache_purged_before', false) && $this->purge_cache_before)
{
/** @var \phpbb\cache\driver\driver_interface $cache */
$cache = $this->container_factory->get('cache.driver');
$cache->purge();
$this->install_config->set('cache_purged_before', true);
}
// Recover install progress
$module_name = $this->recover_progress();
$module_found = false;
$module_index = $this->recover_progress();
// Variable used to check if the install process have been finished
$install_finished = false;
@@ -141,29 +173,13 @@ class installer
try
{
foreach ($this->installer_modules as $name => $module)
$iterator = $this->installer_modules->getIterator();
$iterator->seek($module_index);
while ($iterator->valid())
{
// Skip forward until the current task is reached
if (!$module_found)
{
if ($module_name === $name || empty($module_name))
{
$module_found = true;
}
else
{
continue;
}
}
// Log progress
$this->install_config->set_active_module($name);
// Run until there are available resources
if ($this->install_config->get_time_remaining() <= 0 || $this->install_config->get_memory_remaining() <= 0)
{
throw new resource_limit_reached_exception();
}
$module = $iterator->current();
$name = $iterator->key();
// Check if module should be executed
if (!$module->is_essential() && !$module->check_requirements())
@@ -176,17 +192,31 @@ class installer
$name,
));
$this->install_config->increment_current_task_progress($this->module_step_count[$name]);
continue;
}
else
{
// Set the correct stage in the navigation bar
$this->install_config->set_active_navigation_stage($module->get_navigation_stage_path());
$this->iohandler->set_active_stage_menu($module->get_navigation_stage_path());
$this->iohandler->send_response();
$module->run();
$this->install_config->set_finished_navigation_stage($module->get_navigation_stage_path());
$this->iohandler->set_finished_stage_menu($module->get_navigation_stage_path());
}
// Set the correct stage in the navigation bar
$this->install_config->set_active_navigation_stage($module->get_navigation_stage_path());
$this->iohandler->set_active_stage_menu($module->get_navigation_stage_path());
$module_index++;
$iterator->next();
$module->run();
// Save progress
$this->install_config->set_active_module($name, $module_index);
$this->install_config->set_finished_navigation_stage($module->get_navigation_stage_path());
$this->iohandler->set_finished_stage_menu($module->get_navigation_stage_path());
if ($iterator->valid() && ($this->install_config->get_time_remaining() <= 0 || $this->install_config->get_memory_remaining() <= 0))
{
throw new resource_limit_reached_exception();
}
}
// Installation finished
@@ -208,7 +238,7 @@ class installer
}
catch (user_interaction_required_exception $e)
{
// Do nothing
$this->iohandler->send_response(true);
}
catch (resource_limit_reached_exception $e)
{
@@ -222,7 +252,7 @@ class installer
catch (\Exception $e)
{
$this->iohandler->add_error_message($e->getMessage());
$this->iohandler->send_response();
$this->iohandler->send_response(true);
$fail_cleanup = true;
}
@@ -230,11 +260,12 @@ class installer
{
// Send install finished message
$this->iohandler->set_progress('INSTALLER_FINISHED', $this->install_config->get_task_progress_count());
$this->iohandler->send_response(true);
}
else if ($send_refresh)
{
$this->iohandler->request_refresh();
$this->iohandler->send_response();
$this->iohandler->send_response(true);
}
// Save install progress
@@ -244,6 +275,17 @@ class installer
{
$this->install_config->clean_up_config_file();
$this->cache->purge();
try
{
/** @var \phpbb\cache\driver\driver_interface $cache */
$cache = $this->container_factory->get('cache.driver');
$cache->purge();
}
catch (cannot_build_container_exception $e)
{
// Do not do anything, this is just means there is no config.php yet
}
}
else
{
@@ -270,6 +312,6 @@ class installer
protected function recover_progress()
{
$progress_array = $this->install_config->get_progress_data();
return $progress_array['last_task_module_name'];
return $progress_array['last_task_module_index'];
}
}

View File

@@ -129,7 +129,6 @@ class create_config_file extends \phpbb\install\task_base
else
{
$this->iohandler->add_error_message('UNABLE_TO_WRITE_CONFIG_FILE');
$this->iohandler->send_response();
throw new user_interaction_required_exception();
}
@@ -139,7 +138,6 @@ class create_config_file extends \phpbb\install\task_base
{
// We were unable to create the lock file - abort
$this->iohandler->add_error_message('UNABLE_TO_WRITE_LOCK');
$this->iohandler->send_response();
throw new user_interaction_required_exception();
}
@fclose($fp);

View File

@@ -136,7 +136,6 @@ class obtain_admin_data extends \phpbb\install\task_base implements \phpbb\insta
$this->io_handler->add_user_form_group('ADMIN_CONFIG', $admin_form);
// Require user interaction
$this->io_handler->send_response();
throw new user_interaction_required_exception();
}

View File

@@ -164,7 +164,6 @@ class obtain_board_data extends \phpbb\install\task_base implements \phpbb\insta
$this->io_handler->add_user_form_group('BOARD_CONFIG', $board_form);
$this->io_handler->send_response();
throw new user_interaction_required_exception();
}

View File

@@ -188,7 +188,6 @@ class obtain_database_data extends \phpbb\install\task_base implements \phpbb\in
$this->io_handler->add_user_form_group('DB_CONFIG', $database_form);
// Require user interaction
$this->io_handler->send_response();
throw new user_interaction_required_exception();
}

View File

@@ -144,7 +144,6 @@ class obtain_email_data extends \phpbb\install\task_base implements \phpbb\insta
$this->io_handler->add_user_form_group('EMAIL_CONFIG', $email_form);
$this->io_handler->send_response();
throw new user_interaction_required_exception();
}
}

View File

@@ -115,7 +115,6 @@ class obtain_file_updater_method extends task_base
),
));
$this->iohandler->send_response();
throw new user_interaction_required_exception();
}
}

View File

@@ -180,7 +180,6 @@ class obtain_server_data extends \phpbb\install\task_base implements \phpbb\inst
$this->io_handler->add_user_form_group('SERVER_CONFIG', $server_form);
$this->io_handler->send_response();
throw new user_interaction_required_exception();
}
}

View File

@@ -141,7 +141,6 @@ class obtain_update_ftp_data extends task_base
),
));
$this->iohandler->send_response();
throw new user_interaction_required_exception();
}
}

View File

@@ -93,7 +93,6 @@ class obtain_update_settings extends task_base
),
));
$this->iohandler->send_response();
throw new user_interaction_required_exception();
}
}

View File

@@ -13,7 +13,6 @@
namespace phpbb\install\module\requirements;
use phpbb\install\exception\resource_limit_reached_exception;
use phpbb\install\exception\user_interaction_required_exception;
use phpbb\install\module_base;
@@ -25,41 +24,8 @@ abstract class abstract_requirements_module extends module_base
public function run()
{
$tests_passed = true;
// Recover install progress
$task_name = $this->recover_progress();
$task_found = false;
/**
* @var string $name ID of the service
* @var \phpbb\install\task_interface $task Task object
*/
foreach ($this->task_collection as $name => $task)
{
// Run until there are available resources
if ($this->install_config->get_time_remaining() <= 0 || $this->install_config->get_memory_remaining() <= 0)
{
throw new resource_limit_reached_exception();
}
// Skip forward until the next task is reached
if (!$task_found)
{
if ($name === $task_name || empty($task_name))
{
$task_found = true;
if ($name === $task_name)
{
continue;
}
}
else
{
continue;
}
}
// Check if we can run the task
if (!$task->is_essential() && !$task->check_requirements())
{
@@ -76,7 +42,7 @@ abstract class abstract_requirements_module extends module_base
}
// Module finished, so clear task progress
$this->install_config->set_finished_task('');
$this->install_config->set_finished_task(0);
// Check if tests have failed
if (!$tests_passed)
@@ -91,7 +57,6 @@ abstract class abstract_requirements_module extends module_base
));
// Send the response and quit
$this->iohandler->send_response();
throw new user_interaction_required_exception();
}
}

View File

@@ -158,7 +158,6 @@ class update extends task_base
array_unshift($msg, $e->getMessage());
$this->iohandler->add_error_message($msg);
$this->iohandler->send_response();
throw new user_interaction_required_exception();
}

View File

@@ -101,7 +101,6 @@ class download_updated_files extends task_base
),
));
$this->iohandler->send_response();
throw new user_interaction_required_exception();
}
}

View File

@@ -136,7 +136,6 @@ class show_file_status extends task_base
));
// Show results to the user
$this->iohandler->send_response();
throw new user_interaction_required_exception();
}
else

View File

@@ -105,47 +105,23 @@ abstract class module_base implements module_interface
public function run()
{
// Recover install progress
$task_name = $this->recover_progress();
$task_found = false;
$task_index = $this->recover_progress();
$iterator = $this->task_collection->getIterator();
/**
* @var string $name ID of the service
* @var \phpbb\install\task_interface $task Task object
*/
foreach ($this->task_collection as $name => $task)
if ($task_index < $iterator->count())
{
// Run until there are available resources
if ($this->install_config->get_time_remaining() <= 0 || $this->install_config->get_memory_remaining() <= 0)
{
throw new resource_limit_reached_exception();
}
$iterator->seek($task_index);
}
else
{
$this->install_config->set_finished_task(0);
return;
}
// Skip forward until the next task is reached
if (!$task_found)
{
if ($name === $task_name || empty($task_name))
{
$task_found = true;
if ($name === $task_name)
{
continue;
}
}
else
{
continue;
}
}
// Send progress information
if ($this->allow_progress_bar)
{
$this->iohandler->set_progress(
$task->get_task_lang_name(),
$this->install_config->get_current_task_progress()
);
}
while ($iterator->valid())
{
$task = $iterator->current();
$name = $iterator->key();
// Check if we can run the task
if (!$task->is_essential() && !$task->check_requirements())
@@ -156,20 +132,33 @@ abstract class module_base implements module_interface
));
$this->install_config->increment_current_task_progress($this->task_step_count[$name]);
continue;
}
if ($this->allow_progress_bar)
else
{
// Only increment progress by one, as if a task has more than one steps
// then that should be incremented in the task itself
$this->install_config->increment_current_task_progress();
// Send progress information
if ($this->allow_progress_bar)
{
$this->iohandler->set_progress(
$task->get_task_lang_name(),
$this->install_config->get_current_task_progress()
);
$this->iohandler->send_response();
}
$task->run();
if ($this->allow_progress_bar)
{
// Only increment progress by one, as if a task has more than one steps
// then that should be incremented in the task itself
$this->install_config->increment_current_task_progress();
}
}
$task->run();
// Log install progress
$this->install_config->set_finished_task($name);
$task_index++;
$this->install_config->set_finished_task($task_index);
$iterator->next();
// Send progress information
if ($this->allow_progress_bar)
@@ -181,10 +170,16 @@ abstract class module_base implements module_interface
}
$this->iohandler->send_response();
// Run until there are available resources
if ($this->install_config->get_time_remaining() <= 0 || $this->install_config->get_memory_remaining() <= 0)
{
throw new resource_limit_reached_exception();
}
}
// Module finished, so clear task progress
$this->install_config->set_finished_task('');
$this->install_config->set_finished_task(0);
}
/**
@@ -195,7 +190,7 @@ abstract class module_base implements module_interface
protected function recover_progress()
{
$progress_array = $this->install_config->get_progress_data();
return $progress_array['last_task_name'];
return $progress_array['last_task_index'];
}
/**