Определяем время работы скрипта PHP

Дата публикации: 29.12.2017

vremya-vypolneniya-skripta-phpДоброго времени суток, коллеги! 🙂

Сегодня я решил затронуть такую тему, как время выполнения скрипта PHP и его определение.

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

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

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

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

Сперва мы рассмотрим сам алгоритм определения времени исполнения PHP скрипта, а затем я приведу код, с помощью которого он будет реализовываться.

Время выполнения PHP скрипта — алгоритм определения

Порядок наших действий будет предельно прост:

  1. определяем текущее серверное время в PHP коде перед выполнением действий, прописанных в скрипте;
  2. после того, как скрипт выполнится, снова узнаём серверное время;
  3. вычисляем средствами PHP разницу времени между завершением выполнения скрипта и его запуском.

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

Время работы PHP скрипта — реализация алгоритма

Для вывода текущего времени в PHP коде я решил воспользоваться стандартной PHP функцией microtime(), которая возвращает текущую метку времени в Unix формате с микросекундами.

Зачем такая точность?

Затем, чтобы уловить малейшие изменения времени выполнения скриптов, т.к. иногда доли секунды могут быть фатальны и привести к большим потерям при использовании медленного кода в больших масштабах.

Ну, и плюс, учёт микросекунд при вычислениях влияет на точность калькуляций в положительную сторону.

Для демонстрации своих теоретических повествований я написал простенький скриптик, который вычисляет время прогона пустого цикла с 30 000 000 итераций (решил взять побольше для наглядности):

<?php

$start = microtime(true);

for ($i = 0; $i &lt;= 30000000; $i++)
{
    //ничего не делаем
}

echo 'Скрипт был выполнен за ' . (microtime(true) - $start) . ' секунд';

Как сказано в официальной документации PHP, по умолчанию microtime() возвращает строку в формате «msec sec», где sec — количество секунд с начала эпохи Unix (1 января 1970 0:00:00 GMT), а msec — это количество микросекунд, прошедших после sec.

http://cccp-blog.com/wp-includes/images/banners/templatemonster/banner_content_new.png

Функция PHP microtime() имеет всего один параметр get_as_float, при указании которому значения true можно получить текущее время PHP в секундах, прошедших с начала эпохи Unix с точностью до микросекунд.

Поскольку мне нужно было именно текущее время, а не количество секунд с начала эпохи Unix, то я воспользовался данным параметром, что можно видеть в моём коде.

В итоге, с помощью функции echo(), на экран вывелось следующее сообщение: Скрипт был выполнен за 1.3156361579895 секунд.

Чтобы определить, что данная методика работает верно, я решил задать фиксированное время выполнения скрипта с помощью функции sleep(), которая делает задержку выполнения скрипта на указанное количество секунд.

В итоге, следующая конструкция вернула сообщение Скрипт был выполнен за 2.0000510215759 секунд:

<?php

$start = microtime(true);

sleep(2);

echo 'Скрипт был выполнен за ' . (microtime(true) - $start) . ' секунд';

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

Если они будут всё-таки раздражать вас или вашего заказчика, то можете воспользоваться хаком в виде банального округления до сотых или тысячных долей с помощью PHP функции round(), задействовав её следующим образом:

round(microtime(true) - $start, 2);

Результатом выполнения данного куска кода для вышеприведённого примера станет значение в кругленькие 2 секунды, что устроит самых искушённых перфекционистов 🙂

На этом сегодняшняя информация о том, как можно определить время выполнения скрипта PHP, подходит к концу.

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

Всем удачи и до новых встреч! 🙂

P.S.: если вам нужен сайт, но нет времени самостоятельно его разрабатывать, могу порекомендовать вам своего проверенного партнёра - вебстудию Дениса Нихаева. Было не просто, но я всё-таки выбил для вас скидку 20%, что составит до 20 тысяч рублей в зависимости от выбираемого тарифа 🙂 Вот промо код - CCCP. При заказе сообщите его и скидка вам гарантирована! Друзьям тоже можете рассказать 😉

Понравилась статья? Поделись с друзьями:
  1. 5
  2. 4
  3. 3
  4. 2
  5. 1
3 голоса, в среднем: 5 из 5

Похожие темы

4 комментария к статье "Определяем время работы скрипта PHP"

  1. Edred

    Интересно, для кого написана эта статья? Неужели «разработчики, занимающиеся рефакторингом кода и оптимизацией существующих алгоритмов» не знают как засечь в скрипте время начала и конца и как вывести на экран разницу между этими значениями?

    Я знаю область применения этого знания: на большинстве виртуальных хостингах есть ограничение максимальной продолжительности скрипта. На моем, например, это 30 секунд. А это не очень много, например, мой скрипт, перелопачивающий 600-мегабайтный xml с прайсом Озона на букинистику, работает в 3-4 раза дольше. Но лично мне эта статья ничего нового не сказала, да и другим программистам, которые пишут подобные «долгие» скрипты, не думаю, что что-то этот материал даст.

    1. Heorenmaru

      У меня есть OrangePi, к которому подключен датчик движения. Этот датчик держит состояние единицы 2с. Опрашивать состояние линии надо с интервалом в 1с, этим занимается php скрипт.

      Все бы ничего, но cron может дергать скрипт 1 раз в минуту, для этого в скрипте сделан цикл с задержками, однако он не всегда с одинаковым временем выполняется.

      Чтобы не было наложений, мне пришлось включить проверку времени выполнения, чтобы при превышении 1 минуты скрипт завершился

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *