PHP код времени генерации страницы
02.04.2010 08:19В данной статье я хочу рассказать Вам как подсчитать время генерации страницы, т.е. время выполнения Вашего кода РНР. Вы наверное часто видите такие надписи на сайтах:
Страница сгенерирована за 0.235467 секунд или Page generated in 0.235467 seconds
Полезная вещь однако. Логика работы скрипта такова: Сначала засекается текущее время, затем после генерации страницы снова засекается текущее время, разница между этими значениями выводится на страницу сайта. Все очень даже просто.
Рекомендуется части скрипта, отвечающие за подсчет времени в начале и в конце кода, соответственно, сразу вынести в отдельные файлы и вставлять их по мере необходимости.
Итак, создаем файл start.php, который подсчитывает текущее время (вставляется в том месте, откуда начинаем подсчет, т.е. где-то в начале страницы). Копируем туда следующий код:
<?php
// Начало счетчика генерации страницы
// Считываем текущее время
$start_time = microtime();
// Разделяем секунды и миллисекунды
//(становятся значениями начальных ключей массива-списка)
$part_time = explode('' '',$start_time);
// Это и есть стартовое время
$begin_time = $part_time[1].substr($part_time[0],1);
?>
Стартовое время подсчитали. Теперь код файла end.php, который также подсчитывает текущее время, а затем выводит разность этого времени от подсчитанного в файле start.php, т.е., по сути дела, и выводит время генерации страницы. Файл end.php
<?php
// Помещаем время окончания вычислений в переменную $end_time1
$end_time = microtime();
$part_time = explode('' '',$end_time);
$end_time1 = $part_time[1].substr($part_time[0],1);
printf("Страница сгенерировалась за %.4f секунд",$end_time1 - $begin_time)
?>
Вот практически все. С помощью инструкции include(), файл start.php вставляете туда откуда хотите начать засекать время, а файл end.php туда где хотите остановить Ваш "секундомер". Например <?php include("start.php"); ?> в начале страницы, соответственно <?php include("end.php"); ?> в месте где бы Вы хотели чтобы выводился результат.
Вы наверное заметили в строке, где функция printf(), значение 4f. Так вот, меняя цифру, Вы меняете количество выводимых знаков после запятой, т.е. меняется точность расчета до десятых, сотых и т.д. долей.
Далее хочу объяснить для чего служат функции, применяемые в скрипте и дать несколько советов.
string microtime() - возвращает строку в формате: "микросекунды секунды", в которой секунды - timestamp, возвращаемый функцией time(), а микросекунды - дробная часть секунд, служащаяся для более точного измерения промежутков времени. Функция работает только в системах, которые поддерживают системный вызов gettimeofday(), т.е. практически во всех. Замечание: timestamp - формат времени, который равняется "кол-ву секунд, прошедших с полуночи 1 января 1970 года по Гринвичу до настоящего момента". Этот формат данных принят в осях UNIX, как стандартный. Универсальное и удобное представление, с которым вы еще не раз столкнетесь.
array explode(string separator, string string [, int limit]) - получает строку, заданную в её втором аргументе и пытается найти в ней подстроки, равные первому аргументу. Затем по месту вхождения этих подстрок строка "разрезается" на части, помещаемые в массив-список, который и возвращается. Если задан параметр limit, то учитываются только первые limit-1 участков "разреза". Таким образом, возвращается список из не более чем limit элементов. Замечание: string implode(string glue, array pieces) (синоним - join()) - ф-и, полностью противоположные по значению ф-и explode(). Они берут ассоциативный массив (как правило, это список) pieces и склеивают его значения в единую строку при помощи "строки-клея" glue.
void printf (string format [, mixed args]) - Скажу лишь, что в нашем случае мы используем её для того, чтобы при выводе преобразовать получившееся "время генерации страницы" до числа с плавающей точкой (x.xxxxxx). Т.е. чтобы после точки содержалось не более 6 символов. Замечание: можно было и воспользоваться простым вызовом функции типа echo() или print(). Однако в этом случае, выведется число с большим количеством цифр после плавающей точки!
Советы (а точнее совет=)
Примеры можно использовать для засекания выполнения любого скриптового фрагмента. Т.е., совсем необязательно то, что на сайте засекается полностью генерация динамичной страницы. Некоторые мухлюют, засекая вообще не понятно что; поэтому не приходиться удивляться, что сайт, грузящийся со скоростью черепахи, сгенерирован за удивительно малое время. В принципе, время генерации и время вывода страницы - совсем разные вещи. Например, на сайте - Mindair.com я засекаю время выполнения всего кода PHP, который присутствует.

