В этом небольшой статье я хочу рассказать вам, как засечь время выполнения вашего кода на PHP. Многие называют этот прием подсчетом времени генерации страницы (Page time generated). Мне это название также пришлось по душе, так что в дальнейшем буду употреблять его чаще.
Не говорите мне, что вы ни разу не видели примерно такой надписи на сайтах:
Страница сгенерирована за 0.235467 секунд
или
Page time generated in 0.235467 seconds
или
как у меня на сайте PTG 0,0391 s.
Прикольная
вещь, однако. Не ошибусь, если вы тоже хотите реализовать её на своем
сайте? Хотите - тогда поехали. Сначала объясню логику работы такой
фишки. Она очень проста:
Перед выполнением того кода, который мы хотим засечь, считываем текущее время.
После выполнения кода, опять же считываем текущее время и выводим разницу получившихся времен.
Рекомендую
сразу части скрипта, отвечающие за подсчет времени в начале и в конце
кода, соответственно, вынести в отдельные файлы и вставлять их по мере
необходимости.
Итак, код скрипта start.php, который подсчитывает текущее время (вставлять в том месте, откуда начинаем подсчет, т.е. где-то в начале страницы). <?
#------ файл start.php
// считываем текущее время
$start_time = microtime();
// разделяем секунды и миллисекунды (становятся значениями начальных ключей массива-списка)
$start_array = explode(" ",$start_time);
// это и есть стартовое время
$start_time = $start_array[1] + $start_array[0];
?>
Стартовое время подсчитали. Теперь код файла end.php, который также подсчитывает текущее время, а затем выводит разность этого времени от подсчитанного в файле start.php, т.е., по сути дела, и выводит время генерации страницы. <?
#------ файл end.php
// делаем то же, что и в start.php, только используем другие переменные
$end_time = microtime();
$end_array = explode(" ",$end_time);
$end_time = $end_array[1] + $end_array[0];
// вычитаем из конечного времени начальное
$time = $end_time - $start_time;
// выводим в выходной поток (броузер) время генерации страницы
printf("Страница сгенерирована за %f секунд",$time);
?>
В принципе, все. Файл start.php вставляйте туда, откуда хотите начинать засекать время; end.php - где захотите "остановить ваш секундомер". Вставки файлов можете осуществлять, к примеру, инструкцией include();
Дело
сделано... однако, наверняка вы хотите разобраться, как же работает то,
что мы написали. Лично я не люблю юзать чужие наработки в принципе. А
если и юзаю, то, обязательно разобравшись в их работе. Далее объясню
вам, для чего служат функции, которые мы применяли в примерах и дам
несколько советов.
Функции, использовавшиеся в примерах
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]) - ф-я, полностью аналогичная своей C
версии. Она выводит в броузер строку, составленную на основе строки
форматирования, содержащей некоторые специальные символы, которые будут
впоследствии заменены на значения соответствующих переменных из списка
аргументов. Параметры:
format - строковой формат вывода данных
args - аргументы для форматирования
Я не буду подробно останавливаться на этой функции, так как её полное
описание достаточно объемное (ну не так уж чтобы...), да и сама функция
очень мощная (медлительная в том числе). Скажу лишь, что в нашем случае
мы используем её для того, чтобы при выводе преобразовать получившееся
"время генерации страницы" до числа с плавающей точкой (x.xxxxxx). Т.е.
чтобы после точки содержалось не более 6 символов.
Замечание: можно было и воспользоваться простым вызовом функции типа echo() или print(). Однако в этом случае, выведется число с большим количеством цифр после плавающей точки!
Советы (а точнее совет=)
Примеры
можно использовать для засекания выполнения любого скриптового
фрагмента. Т.е., совсем необязательно то, что на сайте засекается
полностью генерация динамичной страницы. Некоторые мухлюют, засекая
вообще не понятно что; поэтому не приходиться удивляться, что сайт,
грузящийся со скоростью таракана, сгенерирован за удивительно малое
время. В принципе, время генерации и время вывода страницы - совсем
разные вещи.
Вот, пожалуй и все, что я хотел вам рассказать относительно этой темы.