ImportStatusController.php 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. <?php
  2. declare(strict_types=1);
  3. namespace PhpMyAdmin\Controllers;
  4. use PhpMyAdmin\Core;
  5. use PhpMyAdmin\Import\Ajax;
  6. use PhpMyAdmin\Message;
  7. use PhpMyAdmin\Template;
  8. use function header;
  9. use function ini_get;
  10. use function session_start;
  11. use function session_write_close;
  12. use function time;
  13. use function usleep;
  14. /**
  15. * Import progress bar backend
  16. */
  17. class ImportStatusController
  18. {
  19. /** @var Template */
  20. private $template;
  21. /**
  22. * @param Template $template Template object
  23. */
  24. public function __construct(Template $template)
  25. {
  26. $this->template = $template;
  27. }
  28. public function index(): void
  29. {
  30. global $SESSION_KEY, $upload_id, $plugins, $timestamp;
  31. [
  32. $SESSION_KEY,
  33. $upload_id,
  34. $plugins,
  35. ] = Ajax::uploadProgressSetup();
  36. // $_GET["message"] is used for asking for an import message
  37. if (isset($_GET['message']) && $_GET['message']) {
  38. // AJAX requests can't be cached!
  39. Core::noCacheHeader();
  40. header('Content-type: text/html');
  41. // wait 0.3 sec before we check for $_SESSION variable
  42. usleep(300000);
  43. $maximumTime = ini_get('max_execution_time');
  44. $timestamp = time();
  45. // wait until message is available
  46. while (($_SESSION['Import_message']['message'] ?? null) == null) {
  47. // close session before sleeping
  48. session_write_close();
  49. // sleep
  50. usleep(250000); // 0.25 sec
  51. // reopen session
  52. session_start();
  53. if (time() - $timestamp > $maximumTime) {
  54. $_SESSION['Import_message']['message'] = Message::error(
  55. __('Could not load the progress of the import.')
  56. )->getDisplay();
  57. break;
  58. }
  59. }
  60. echo $_SESSION['Import_message']['message'] ?? '';
  61. if (isset($_SESSION['Import_message']['go_back_url'])) {
  62. echo $this->template->render('import_status', [
  63. 'go_back_url' => $_SESSION['Import_message']['go_back_url'],
  64. ]);
  65. }
  66. } else {
  67. Ajax::status($_GET['id']);
  68. }
  69. }
  70. }