Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11639
Последний выпуск: 19.06.2015

Страница сгенерирована за ...

Автор: Makswell
Источник: http://progers.ru/

Всем доброго времени суток!

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

Не говорите мне, что вы ни разу не видели примерно такой надписи на сайтах:

Страница сгенерирована за 0.235467 секунд

или

Page generated in 0.235467 seconds

Прикольная вещь, однако. Не ошибусь, если вы тоже хотите реализовать её на своем сайте? Хотите - тогда поехали.

Сначала объясню логику работы такой фишки. Она очень проста:

  • Перед выполнением того кода, который мы хотим засечь, считываем текущее время.
  • После выполнения кода, опять же считываем текущее время и выводим разницу получившихся времен.

Рекомендую сразу части скрипта, отвечающие за подсчет времени в начале и в конце кода, соответственно, вынести в отдельные файлы и вставлять их по мере необходимости.

Итак, код скрипта 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(). Однако в этом случае, выведется число с большим количеством цифр после плавающей точки!

Советы (а точнее совет=)

  • Примеры можно использовать для засекания выполнения любого скриптового фрагмента. Т.е., совсем необязательно то, что на сайте засекается полностью генерация динамичной страницы. Некоторые мухлюют, засекая вообще не понятно что; поэтому не приходиться удивляться, что сайт, грузящийся со скоростью таракана, сгенерирован за удивительно малое время. В принципе, время генерации и время вывода страницы - совсем разные вещи. Например, на нашем сайте - Progers.ru мы засекаем время выполнения всего кода PHP, который присутствует.

Вот, пожалуй и все, что я хотел вам рассказать относительно этой темы. Типичный пример можете видеть на нашем сайте - Progers.ru, где в копирайтах выводится это пресловутое время генерации страницы.

Если вы нашли ошибки\неточности в статье или просто хотите поделиться впечатлениями, аль спросить меня о чем-либо по этой теме, то пишите или оставляйте здесь свои комментарии.

На этом я прощаюсь с вами. Учил вас засекать время генерации страницы Makswell =%)

Оставить комментарий

Комментарий:
можно использовать BB-коды
Максимальная длина комментария - 4000 символов.
 

Комментарии

1.
97K
26 апреля 2016 года
Alexander Dunaevsky
0 / / 26.04.2016
+6 / -0
Мне нравитсяМне не нравится
26 апреля 2016, 18:07:42
Со дня последнего коментария прошло 10 лет, а код до сих пор рабочий :)
2.
Аноним
+7 / -0
Мне нравитсяМне не нравится
26 апреля 2006, 22:43:00
я предлагаю проще:
в начале - define("START_TIME", microtime(true));
в конце - printf("Время выполнения: %.5f с", microtime(true)-START_TIME);
3.
Аноним
Мне нравитсяМне не нравится
3 февраля 2006, 12:15:45
Ребята, несоответствие :)

start.php - старт.пхп
end.php - конец.пхп

Или
start.php+stop.php (start.php+finish.php)

или

begin.php+end.php

Смешивать не надо
4.
Аноним
+1 / -0
Мне нравитсяМне не нравится
3 февраля 2006, 03:52:34
Ага, разобрался.
Микросекунды microtime() выводит в виде "0.97902400" - то есть в секундах.
Всё работает. Мои извинения и благодарность автору.
5.
Аноним
Мне нравитсяМне не нравится
3 февраля 2006, 03:17:20
Туплю я что-то...
$start_time = $start_array[1] + $start_array[0];
А что мы получим, если сложим секунды и микросекунды, а? Нам их ведь не сложить надо, или так, но перед этим ко второму "0." приписать. Или я чего-то не понял?
6.
Аноним
Мне нравитсяМне не нравится
25 ноября 2005, 02:17:01
А какая средняя скорость генерации? У меня получилось 0.002029, вроде это слишком быстро?
7.
Аноним
Мне нравитсяМне не нравится
12 ноября 2005, 17:31:59
А как секундомер на php написать не подскажете?
8.
Аноним
Мне нравитсяМне не нравится
14 сентября 2005, 08:08:39
на пятом php можно проще - $start_time = microtime(true). Булево значение указывает возвращать ли значение сразу как float.
9.
Аноним
Мне нравитсяМне не нравится
29 апреля 2005, 02:42:38
Молодчина;) Чем больше будет статей, даже по банальным и несложным вопросам, тем чище будет форум =)
10.
Аноним
+0 / -1
Мне нравитсяМне не нравится
16 апреля 2005, 06:18:22
Можно юзать просто (double)microtime() для получения результата в нормальном виде.
11.
Аноним
+0 / -1
Мне нравитсяМне не нравится
10 апреля 2005, 16:40:03
пробовал "засечь" сколько времени выполняется сам скрипт - в среднем получал - Страница сгенерирована за 0.000110 секунд - дак вот, может быть для более точного определения генерации какого-либо куска скрипта следует из общего времени генерации вычитать время генерации самого скрипа, определяющего время? У меня разброс во времени генерации состовлял миллионные доли секунды, т.е. $time = $end_time - $start_time - 0.0001 и получим время без времени действия описанного скрипта.
12.
Аноним
+0 / -1
Мне нравитсяМне не нравится
10 апреля 2005, 10:32:16
Вместо printf можно использовать { echo 'Страница сгенерирована за'.round($time, 6).'с'; }. Хотя здесь не принципиально/ :)
13.
Аноним
+1 / -1
Мне нравитсяМне не нравится
9 апреля 2005, 10:18:46
Зиповать... хм, а зипы пропускают что ли? Ладно... учтем... спасибо...
14.
Аноним
+0 / -1
Мне нравитсяМне не нравится
8 апреля 2005, 13:39:27
Хотя нет, есть один - плиз, не помещайте файло в rar-архивы (это я про http://progers.ru/), зипуйте! Всякие долбанутые фаерволы на работе не пропускают их!
15.
Аноним
+0 / -1
Мне нравитсяМне не нравится
8 апреля 2005, 13:34:21
Ну а что тут ещё можно добавить ;) ?..
16.
Аноним
+1 / -0
Мне нравитсяМне не нравится
7 апреля 2005, 22:03:08
Ну-с.. что-то комментов нет :-) Кто-нибудь что-нибудь скажет? ...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог