diff options
author | Marc Alexander <admin@m-a-styles.de> | 2016-03-01 21:52:05 +0100 |
---|---|---|
committer | Marc Alexander <admin@m-a-styles.de> | 2016-03-01 21:52:05 +0100 |
commit | a38a6ec7f551ca0c5c81969520ad6390e69b0a60 (patch) | |
tree | 94771f90ca2949327f5a4fab22b57cf17f953069 /phpBB/phpbb | |
parent | b80cb8e796a107a49b77b0efe9d43ee7ef550655 (diff) | |
parent | b1a136e7bd8cc06ee320655a4ee7cf72dcd7c611 (diff) | |
download | forums-a38a6ec7f551ca0c5c81969520ad6390e69b0a60.tar forums-a38a6ec7f551ca0c5c81969520ad6390e69b0a60.tar.gz forums-a38a6ec7f551ca0c5c81969520ad6390e69b0a60.tar.bz2 forums-a38a6ec7f551ca0c5c81969520ad6390e69b0a60.tar.xz forums-a38a6ec7f551ca0c5c81969520ad6390e69b0a60.zip |
Merge pull request #4196 from CHItA/ticket/14487
[ticket/14487] Try to handle connection timeouts
Diffstat (limited to 'phpBB/phpbb')
-rw-r--r-- | phpBB/phpbb/install/controller/timeout_check.php | 80 | ||||
-rw-r--r-- | phpBB/phpbb/install/event/kernel_exception_subscriber.php | 1 | ||||
-rw-r--r-- | phpBB/phpbb/install/helper/iohandler/ajax_iohandler.php | 41 | ||||
-rw-r--r-- | phpBB/phpbb/install/installer.php | 22 |
4 files changed, 142 insertions, 2 deletions
diff --git a/phpBB/phpbb/install/controller/timeout_check.php b/phpBB/phpbb/install/controller/timeout_check.php new file mode 100644 index 0000000000..1c90e3caf3 --- /dev/null +++ b/phpBB/phpbb/install/controller/timeout_check.php @@ -0,0 +1,80 @@ +<?php +/** + * + * This file is part of the phpBB Forum Software package. + * + * @copyright (c) phpBB Limited <https://www.phpbb.com> + * @license GNU General Public License, version 2 (GPL-2.0) + * + * For full copyright and license information, please see + * the docs/CREDITS.txt file. + * + */ + +namespace phpbb\install\controller; + +use Symfony\Component\HttpFoundation\JsonResponse; + +class timeout_check +{ + /** + * @var helper + */ + protected $helper; + + /** + * @var string + */ + protected $phpbb_root_path; + + /** + * Constructor + * + * @param helper $helper + * @param string $phpbb_root_path + */ + public function __construct(helper $helper, $phpbb_root_path) + { + $this->helper = $helper; + $this->phpbb_root_path = $phpbb_root_path; + } + + /** + * Controller for querying installer status + */ + public function status() + { + $lock_file = $this->phpbb_root_path . 'store/io_lock.lock'; + $response = new JsonResponse(); + + if (!file_exists($lock_file)) + { + $response->setData(array( + 'status' => 'fail', + )); + } + else + { + $fp = @fopen($lock_file, 'r'); + + if ($fp && flock($fp, LOCK_EX | LOCK_NB)) + { + $status = (filesize($lock_file) >= 2 && fread($fp, 2) === 'ok') ? 'continue' : 'fail'; + + $response->setData(array( + 'status' => $status, + )); + flock($fp, LOCK_UN); + fclose($fp); + } + else + { + $response->setData(array( + 'status' => 'running', + )); + } + } + + return $response; + } +} diff --git a/phpBB/phpbb/install/event/kernel_exception_subscriber.php b/phpBB/phpbb/install/event/kernel_exception_subscriber.php index c2960cb13c..60b7d9a400 100644 --- a/phpBB/phpbb/install/event/kernel_exception_subscriber.php +++ b/phpBB/phpbb/install/event/kernel_exception_subscriber.php @@ -21,6 +21,7 @@ use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface; use Symfony\Component\HttpKernel\KernelEvents; use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent; +use Symfony\Component\HttpFoundation\JsonResponse; /** * Exception handler for the installer diff --git a/phpBB/phpbb/install/helper/iohandler/ajax_iohandler.php b/phpBB/phpbb/install/helper/iohandler/ajax_iohandler.php index 8c62ec7bd0..c168d26425 100644 --- a/phpBB/phpbb/install/helper/iohandler/ajax_iohandler.php +++ b/phpBB/phpbb/install/helper/iohandler/ajax_iohandler.php @@ -44,6 +44,11 @@ class ajax_iohandler extends iohandler_base /** * @var string */ + protected $phpbb_root_path; + + /** + * @var string + */ protected $file_status; /** @@ -77,14 +82,20 @@ class ajax_iohandler extends iohandler_base protected $redirect_url; /** + * @var resource + */ + protected $file_lock_pointer; + + /** * Constructor * * @param path_helper $path_helper * @param \phpbb\request\request_interface $request HTTP request interface * @param \phpbb\template\template $template Template engine * @param router $router Router + * @param string $root_path Path to phpBB's root */ - public function __construct(path_helper $path_helper, \phpbb\request\request_interface $request, \phpbb\template\template $template, router $router) + public function __construct(path_helper $path_helper, \phpbb\request\request_interface $request, \phpbb\template\template $template, router $router, $root_path) { $this->path_helper = $path_helper; $this->request = $request; @@ -96,6 +107,7 @@ class ajax_iohandler extends iohandler_base $this->download = array(); $this->redirect_url = array(); $this->file_status = ''; + $this->phpbb_root_path = $root_path; parent::__construct(); } @@ -433,6 +445,33 @@ class ajax_iohandler extends iohandler_base } /** + * Acquires a file lock + */ + public function acquire_lock() + { + $lock_file = $this->phpbb_root_path . 'store/io_lock.lock'; + $this->file_lock_pointer = @fopen($lock_file, 'w+'); + + if ($this->file_lock_pointer) + { + flock($this->file_lock_pointer, LOCK_EX); + } + } + + /** + * Release file lock + */ + public function release_lock() + { + if ($this->file_lock_pointer) + { + fwrite($this->file_lock_pointer, 'ok'); + flock($this->file_lock_pointer, LOCK_UN); + fclose($this->file_lock_pointer); + } + } + + /** * Callback function for language replacing * * @param array $matches diff --git a/phpBB/phpbb/install/installer.php b/phpBB/phpbb/install/installer.php index b5709e96c7..240423ae78 100644 --- a/phpBB/phpbb/install/installer.php +++ b/phpBB/phpbb/install/installer.php @@ -22,6 +22,7 @@ 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\ajax_iohandler; use phpbb\install\helper\iohandler\cli_iohandler; use phpbb\install\helper\iohandler\iohandler_interface; use phpbb\path_helper; @@ -126,6 +127,11 @@ class installer */ public function run() { + if ($this->iohandler instanceof ajax_iohandler) + { + $this->iohandler->acquire_lock(); + } + // Load install progress $this->install_config->load_config(); @@ -174,7 +180,16 @@ class installer try { $iterator = $this->installer_modules->getIterator(); - $iterator->seek($module_index); + + if ($module_index < $iterator->count()) + { + $iterator->seek($module_index); + } + else + { + $iterator->seek($module_index - 1); + $iterator->next(); + } while ($iterator->valid()) { @@ -256,6 +271,11 @@ class installer $fail_cleanup = true; } + if ($this->iohandler instanceof ajax_iohandler) + { + $this->iohandler->release_lock(); + } + if ($install_finished) { // Send install finished message |