Sadda.ru Ironetcart Андроид Ассемблер MASM32 Linux Все статьи Table of Contents


 

Прогресс-бар на PHP

  Макс Петров июнь 2015

      Бывают "долгоиграющие" скрипты PHP. Например, пересчет статистики форума, вообще любая функция, которая требует анализа всех содержащихся на форуме сообщений. При большом объеме вычислений PHP-скрипт будет работать минуты, десятки минут, нам же желательно иметь хоть какое-нибудь средство для контроля хода выполнения, чтобы видеть, что PHP-скрипт не завис и оценивать время, оставшееся до его завершения.

      В Интернете предлагаются по этому поводу мудреные решения, как то: использовать сокеты, ajax, jquery. Но можно ведь сделать просто, а если можно сделать просто, то незачем и усложнять.

      Нам поможет Javascript. Javascript выполняется браузером сразу по его загрузке. Иными словами, как только браузер получает закрывающий тег </script>, браузер приступает к исполнению всего кода, заключенного в контейнере <script type="text/javascript"> ... </script>. Поэтому, чтобы заставить браузер отражать ход выполнения программы на сервере (PHP-программы), нам нужно всего лишь посылать с сервера браузеру - по кусочкам - иллюстрирующий этот ход выполнения Javascript.

      Допустим, у нас на PHP большой цикл, в котором производятся некие вычисления:

<?php set_time_limit(600); progress( 'start', 0, 1 ); for ( $i=0; $i<100000; $i++ ) { // здесь вычисления progress( 'run', ($a/100000)*100, 1 ); } progress( 'stop', 100, 1 ); set_time_limit(30); ?>

Progress(...) - это PHP-функция, которая будет посылает в браузер порции Javascript-а с информацией о ходе выполнения цикла. Сама функция выглядит так:

<?php function progress($status, $percent, $step) { global $percentlast; switch ($status) { case 'start': echo ' <script type="text/javascript"> document.getElementById("progress").style.background = "red"; document.getElementById("progress").style.height = "2px"; document.getElementById("progress").style.width = "' . $percent . '%"; </script> '; flush(); break; case 'run': if ( @$percentlast + $step <= $percent ) { $percentlast = $percent; echo ' <script type="text/javascript"> document.getElementById("progress").style.width = "' . $percent . '%"; </script> '; flush(); } break; case 'stop': echo ' <script type="text/javascript"> document.getElementById("progress").style.height = "0px"; document.getElementById("progress").style.width = "0%"; </script> '; flush(); break; } } ?>

      Как видим, функция progress отправляет в поток вывода (отправляет браузеру) вполне тривиальный Javascript, сутью которого является изменение пустого (без текста) HTML-контейнера <div id="progress"></div>, присутствующего в ожидающей выполнения PHP-скрипта HTML-странице. Посылаемые сервером Javascript-инструкции заставляют этот див удлиняться пропорционально степени выполнения PHP-скрипта.

      Параметр $step - это шаг в процентах выполнения между отсылками сервером браузеру фрагментов Javascript. Например, если $step = 1, сервер будет посылать данные только при изменении степени выполнения PHP-скрипта не менее, чем на 1 процент. При этом от сервера будет отправлено всего не более 102 Javascript-фрагмента (включая стартовый и завершающий). Можно сказать, параметр $step экономит трафик, чем он больше, тем меньше текста будет отправлено браузеру, а изменение длины <div id="progress"></div> при увеличении $step будет становиться более скачкообразным.

      Как это выглядит. В браузер загружается верхняя часть страницы до места, куда должны быть выведены результаты PHP-вычислений. По нижнему обрезу загруженного появляется прогресс-бар в виде полоски, которая, постепенно увеличиваясь в длине, двигается к правой границе страницы. Полоска, наконец, достигает правой границы, после чего она исчезает, выводятся результаты вычислений и весь контент, который должен быть расположен ниже.



Ironetcart

      Техническая поддержка: http://ironburattin.ru
      Взять движок: Форум на файлах «Ironetcart» (скачать)

      Разработка форумного движка
      Форум «Железный Бураттин» (название и концепция)
      Статическая защита форм
      Идеальная капча
      Как я победил магические кавычки
      Внеклавиатурные символы HTML
      Хранимые XSS-атаки и защита от них (удаляем javascript из html в браузере)
      Защита визуального html-редактора (фильтрация HTML на стороне сервера)
      Скорость движка форума: файлы или база данных
      Прогресс-бар на PHP
      Зачем тупому форуму поиск?

     


© Max Petrov При использовании материалов ссылка на sadda.ru обязательна