Php засечь время. PHP: время выполнения скрипта на практике. Практическое значение времени исполнения


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

Можно приводить различные варианты. Зачем кому-то может потребоваться узнавать время за которое выполняется код.
Это может быть как личный интерес в тестировании на скорость выполнения чужих функций, библиотек, классов и тд.
Так и при разработке своих скриптов и замера скорости выполнения с целью дальнейшего улучшения.
Представим, что вы разработали какую-то функцию, которая выполняется в течении какого-то времени и вас не устраивает ее скорость работы.
И вы постепенно ее улучшаете. Но не совсем понятно приносят ли эти улучшения какую-то пользу в скорости выполнения или нет.
Для этого можно замерить скорость ее выполнения.

Вариант первый (Не совсем точный но подойдет как пример):
Можно воспользоваться встроенным в язык PHP классом DateTime для предоставлении даты и времен (он начал поддерживаться с PHP 5 по текущую версию PHP7).
Оговорю сразу, что в рамках данного примера для замера скорости будет использоваться функция usleep() , которая будет откладывать выполнение программы на указанное количество микросекунд. Вы можете выполнить проверку на своем коде, который необходимо проверить на скорость выполнения.

И так. Для начала отметим точку с которой необходимо начинать засекать время:

$startTime = new DateTime("now");
Создаем экземпляр класса DateTime с параметром "now" для получения текущего времени.
После этого необходимо разместить тело тестируемого скрипта (для примера это функция usleep).

$endTime = new DateTime("now");
И получаем разницу между началом и окончанием выполнения скрипта:
$interval = $startTime->diff($endTime);
И отображаем полученный результат в виде количества секунд и миллисекунд:
echo $interval->format("%S секунд, %f микросекунд");

Для более подробного и полного результата можно выполнить полную распечатку результата в плоть до указания года.
$interval->format("%Y лет, %M месяцев, %D дней, %H часов, %I минут, %S секунд, %f микросекунд"");


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

Скорость выполнения скрипта у меня:
01 секунд, 441 микросекунд

Весь код данного примера:
$startTime = new DateTime("now"); usleep(1000000); $endTime = new DateTime("now"); $interval = $startTime->diff($endTime); echo ($interval->format("%S секунд, %f микросекунд"));

Вариант второй :
Воспользоваться встроенной функцией microtime(), которая поддерживается с PHP4 по текущую версию PHP7 на момент написания статьи.

Функция microtime() возвращает текущую метку времени Unix в микросекундах. Эта функция доступна только на операционных системах, у которых есть системный вызов gettimeofday() .


Создаем переменную, которая будет засекать время начала проверки:
$start = microtime(true);
Параметром функции microtime передаем true для того, чтобы получить результат в вещественном виде float , представляющий собой текущее время в секундах, прошедших с начала эпохи Unix с точностью до микросекунд.
После этого размещаем тело тестируемого скрипта (для примера это функция usleep).
usleep(1000000); // Функция, которая откладывает время выполнения программы на 1000000 микросекунд
Теперь получаем время окончания работы скрипта:
$end = microtime(true);
Находим разницу между началом и концом работы скрипта:
$diff = $end - $start;
И отображаем результат:
echo "Время выполнения скрипта: ".($diff)." сек.";

Мой скрипт выполнялся в течении:
Время выполнения скрипта: 1.0004560947418 сек.

Весь код данного примера:
$start = microtime(true); usleep(1000000); $end = microtime(true); $diff = $end - $start; echo "Время выполнения скрипта: ".($diff)." сек.";

Какой вариант работает более точно не знаю, но предполагаю, что вариант с использованием функции microtime() должен быть более точным, так как в приведенном первом варианте, на создание экземпляра класса DateTime("now") должно затрачиваться больше времени.

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

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

$start = microtime(true);
$sum = 0;
for ($i = 0; $i < 100000; $i++) $sum += $i;
echo "Время выполнения скрипта: ".(microtime(true) - $start);
?>

В результате мы увидим, что время выполнения скрипта будет, например, таким: "0.014652967453 ". Если округлить, то это 0.015 секунды. Это и есть время выполнения скрипта.

Теперь о том, как это работает. Функция microtime() с переданным значением true возвращает число секунд, прошедших с полуночи 01.01.1970 , причём это значение подсчитано до сотых долей секунды.

Далее идёт обычный скрипт, который мы и проверяем. Вместо него, безусловно, будет Ваш скрипт. И, наконец, последней строкой идёт разница между текущим временем (после выполнения скрипта) и тем, что мы зафиксировали при старте скрипта. Разница времени после выполнения скрипта и времени до начала его работы, и есть время выполнения скрипта .

Думаю, здесь всё просто. А вот применять этот способ подсчёта времени я Вам настоятельно рекомендую. Например, когда я отлаживал работу своего движка, на котором и стоит данный сайт, я ускорил его работу почти в 2 раза.

Приветствую Вас, уважаемые читатели блога webcodius! Итак, сразу к делу. Сначала отвечу на вторую часть вопроса: зачем же может понадобиться измерить время выполнения скрипта ?.При работе над отладкой веб-проектов важным фактором, который следует обязательно учитывать, является время выполнения скриптов. Этот параметр необходим чтобы понять насколько быстро и производительно работает тот или иной кусок кода. Определив время потраченное сервером на выполнение php скрипта, вы сможете сделать вывод: требуется ли оптимизация кода или нет. Далее рассмотрим как это сделать.

Для анализа производительности php-скриптов существуют различные расширения и библиотеки, например XDebug, которое может выполнять отладку скриптов и профилировать их по времени выполнения. Но для использования таких расширений требуется потратить время на их установку и настройку. Конечно для оптимизации работы крупных проектов со соложной архитектурой, большим количеством скриптов и миллионами строк кода лучше воспользоваться такими расширениями. Но если необходимо оптимизировать 3-4 скрипта с одной или двумя сотнями строк кода, то для измерения времени работы скрипта можно воспользоваться только средствами php.

Как в php определить время выполнения скрипта

Данная задача легко решается с помощью функций для работы с датой и временем, а именно встроенной функции microtime() , которая возвращает число секунд, прошедших с полуночи 01.01.1970. Вызвав эту функцию дважды, мы можем вычислить время прошедшее в период между вызовами:

Если запустить скрипт, то результат будет примерно таким:

Время выполнения скрипта: 0,00059400000000001

Кратко, как это работает. С помощью функции microtime(true) запоминаем метку времени начала работы скрипта в переменную $start . Далее идет рабочий код, который выполняет какие-то действия. В данном примере просто вызывается функция usleep() , которая замедляет работу скрипта на задданное количество микросекунд. И затем получаем время окончания работы скрипта, запоминаем ее в переменную $end и вычисляем время выполнения кода путем вычитания $start из $end . В итоге получили время выполнения скрипта.

Теперь зная как определить в php время выполнения скрипта , вы можете приступать к оптимизации различных блоков кода. Желаю удачи и до встречи в следующих постах!

15 ноября 2011 в 06:52

Фоновое выполнение скрипта на PHP без crontab

  • Разработка веб-сайтов

Озадачили меня тут написать демона на PHP. Т.е. скрипт, который будет заданное количество раз в заданное количество часов в случайное время (всегда случайное) выполнять определенные действия, и все это без использования cron"a.

До этого никогда не заморачивался, а тут после постановки задачи, начал было думать что так нельзя, что php скрипт надо вызывать браузером…ну задача то поставлена, надо выполнять.

Первая мысль - отключить ограничение времени выполнения скрипта. Запрещено хостером.

Вторая мысль - яваскриптом повторять аякс-запрос периодически (да хоть раз в секунду). - нельзя (требование заказчика).

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

1. Пачка сигарет, ночь, гугл, доки, книги, мануалы….
goto 1…

На выходе получаю:
Задача_1:
Реализовать генератор времен выполнения скрипта, исходя из заданных количества раз и количества часов. Хранить где-то эти времена.

Задача_2:
Работать после закрытия браузера

Задача_3:
Не вылетать после окончания ограничения времени выполнения скрипта

Задача_4:
Выполнять в нужное время какие-то действия.

Итак…
Пишем в конфиге исходные данные:

Session_start(); // Старт сессии $num_starts = 120; // Количество запусков скрипта за промежуток времени $hours = 1; // Количество часов, в течение которых нужно запускать скрипт $num_starts раз. $time_sec = $hours*3600; // Количество секунд в цикле запусков $time_to_start = array(); // Собственно, массив с временами запусков ignore_user_abort(1); // Игнорировать обрыв связи с браузером

Далее пишем функцию, которая поможет нам сгенерировать времена запуска.
В ней мы генерируем случайное число от 0 до количества секунд в исходном интервале.
/****** * @desc Генерируем интервал между запусками. */ function add_time2start() { global $time_sec, $time_to_start; $new_time = time()+rand(0, $time_sec); if (!in_array($new_time, $time_to_start)) { // Если такого времени в массиве нет - добавим $time_to_start = $new_time; } else { add_time2start(); // Если такое время уже есть - генерируем заново. } }

$k = 1; if ($_SESSION["num_st"] == "" || $_SESSION["num_st"][$num_starts-1] < time()) { // проверка, что в сессию не записаны данные и что эти данные не устарели. do { add_time2start($k); $k++; } while ($k < = $num_starts); sort($time_to_start, SORT_NUMERIC); $_SESSION["num_st"] = $time_to_start; }

Теперь надо заставить скрипт работать, не обращая внимания на максимальное время выполнения, установленное сервером.
Принцип таков:
1) Определяем время начала работы скрипта;
2) Определяем установленное ограничение на время выполнения.
3) Запускаем цикл, внутри которого считаем текущее время и вычисляем общее время работы скрипта, сверяем текущее время со значениями в массиве времен запуска, и если совпадение есть, выполняем заданные действия (у меня они в файле exec.php). Для запуска файлов используем сокеты.
4) Повторяем цикл пока время работы скрипта не приблизится к максимально разрешенному. Я поставил - пока до максимального времени не останется 5 секунд.

Итак… считаем начальные данные по времени:

$start_time = microtime(); // Узнаем время запуска скрипта $start_array = explode(" ",$start_time); // Разделяем секунды и миллисекунды $start_time = $start_array; // получаем стартовое время скрипта $max_exec = ini_get("max_execution_time"); //Получаем максимально возможное время работы скрипта
Собственно, цикл. Комментарии в коде.

Do{ $nowtime = time(); // Текущее время //// Если текущее время есть в массиве с временами выполнения скрипта...... if (in_array($nowtime, $_SESSION["num_st"])) { // Сокетом цепляемся к файлу с основным содержанием действий $http = fsockopen("test.ru",80); /// заодно передаем ему данные сессии и время когда он должен сработать fputs($http, "GET http://test.ru/exec.php?".session_name()."=".session_id()."&nowtime=$nowtime HTTP/1.0\r\n"); fputs($http, "Host: test.ru\r\n"); fputs($http, "\r\n"); fclose($http); } //// выполнили заданное действие // Узнаем текущее время чтобы проверить, дальше ли вести цикл или перезапустить $now_time = microtime(); $now_array = explode(" ",$now_time); $now_time = $now_array; // вычитаем из текущего времени начальное начальное $exec_time = $now_time - $start_time+$exec_time; /// тормозимся на секунду usleep(1000000); //Остановка скрипта, работающего в фоновом режиме. Я другого способа не придумал. if (file_exists("stop.txt")) exit; //Проверяем время работы, если до конца работы скрипта //осталось менее 5 секунд, завершаем работу цикла. } while($exec_time < ($max_exec - 5));

Ну и, если разрешенное время подходит к концу, то завершаем цикл и благополучно запускаем этот же скрипт другие процессом (в 5 секунд точно уложимся)

// Запускаем этот же скрипт новым процессом и завершаем работу текущего $http = fsockopen("test.ru",80); fputs($http, "GET http://test.ru/index.php?".session_name()."=".session_id()."&bu=$max_exec HTTP/1.0\r\n"); fputs($http, "Host: test.ru\r\n"); fputs($http, "\r\n"); fclose($http);

Когда дописал все, озадачился полезным применением…Использовать его можно как службу. Он может следить за чем-то в сети и уведомлять Вас, например, по почте. И не надо никаких cron"ов.

Скрипт можно еще оптимизировать - доработкой не занимался.
Кстати, вот от чего я не смог оторваться - браузер все же придется открыть, чтобы изначально запустить скрипт.