Buderus-trade.ru

Теплотехника Будерус
0 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Php измерить время выполнения скрипта. Как измерить время работы скрипта на php и для чего это нужно? Практическое значение времени исполнения

Php измерить время выполнения скрипта. Как измерить время работы скрипта на php и для чего это нужно? Практическое значение времени исполнения

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Здесь значение «300 » вы также сменяете на нужное вам в секундах. Обратите внимание , что при использовании PHP в безопасном режиме эта функция будет недоступна.

Увеличение времени выполнения PHP-скрипта через встроенную функцию «set_time_limit»

Третий способ, наверное, один из самых популярных – использование функции «set_time_limit » для изменения времени выполнения скрипта. Также используется непосредственно в самом файле PHP. Пример:

Здесь «300 » вы также изменяете на нужное вам значение. Вставлять код желательно в самом верху.

Увеличение времени выполнения PHP-скрипта через файл.htaccess

Последний вариант заключается в редактировании файла .htaccess , который находится в корне вашего сайта (если таковой отсутствует – создайте его).

В самый верх этого файла вставьте:

Php_value max_execution_time 300

Значение «300 » вы также меняете на свое.

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

Как узнать, сколько времени отведено на выполнение PHP-скрипта?

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

Для этого создайте PHP-файл в корне вашего сайта, где выведите значение установленного времени:

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

Выполнения скрипта имеет значение для целей определения времени формирования страницы или её элемента, для построения безопасного и надежного кода сайта в целом.

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

Читайте так же:
Сколько цифр записывать с счетчика

Время исполнения скрипта

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

Простой скрипт: пример определения времени исполнения цикла.

PHP предоставляет разработчику две функции: microtime() и time(), которые можно использовать для формирования временных меток. Определяя эти метки перед началом исследуемого кода и по его завершении, можно вычислить разницу, то есть получить реальное время, которое было затрачено на исполнение кода.

Функции microtime() и time()

В данном примере в цикле используется разное количество итераций: 567 или 56789. В первом случае цикл работает быстрее, во втором — в десять раз медленнее.

Функция microtime() может использоваться без параметров, и тогда её результатом будет строка символов из двух чисел, разделенных пробелом. Первое число — количество микросекунд, второе число — количество секунд, прошедших с даты, признаваемой началом эпохи «Юникс».

Если функция microtime(true) вызывается с параметром, и его значение true, то результатом будет число — как сумма количества секунд и микросекунд. Использование функции без параметров эквивалентно вызову: microtime(false).

Функция time() не работает с микросекундами, потому на меньшем количестве итераций дает нулевое время исполнения.

Практическое значение времени исполнения

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

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

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

  • недоступен;
  • заблокирован;
  • находиться на техническом обслуживании.

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

Установив точное время для исполнения скрипта, например, 10 сек., 1 мин. или 5 мин., можно обеспечить собственному ресурсу строгое соблюдение регламента по обработке всех удаленных ресурсов, которые ему необходимы для решения своих задач.

Время и место исполнения скрипта

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

Запуск PHP-скрипта может производиться по технологии AJAX, то есть после клика посетителя сайта на элементе страницы. Это обычная практика, когда страница не обновляется целиком, а только её отдельный элемент. Как правило, такое решение может быть связано с выборкой нужных данных. Любая задержка исполнения здесь критична для посетителя. Если время превышает его ожидания, он просто уйдет на более быстрый и комфортный ресурс.

Разработчик может оценить, сколько времени занимает требуемый процесс, и в случае если на 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») должно затрачиваться больше времени.

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

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

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

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

Читайте так же:
Не работает счетчик фпс

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

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

PHP установил тайм-аут для скрипта с системным вызовом, установил ограничение по времени, которое не работает

У меня есть PHP-скрипт командной строки, который запускает запрос wget, используя каждый элемент массива с foreach. Этот запрос wget иногда может занять много времени, поэтому я хочу иметь возможность установить тайм-аут для завершения работы скрипта, например, если он превысит 15 секунд. Я отключил безопасный режим PHP и попробовал set_time_limit(15) в начале сценария, однако он продолжается бесконечно. Обновление: Спасибо Dor за указание на то, что это связано с тем, что set_time_limit() не уважает system() звонки.

Поэтому я пытался найти другие способы убить сценарий после 15 секунд выполнения. Однако я не уверен, можно ли проверить время выполнения сценария, когда он одновременно находится в середине запроса wget (цикл do while не работал). Может быть, разветвить процесс с помощью таймера и настроить его на убийство родителя через определенное время?

Спасибо за любые советы!

Обновление: Ниже приведен мой соответствующий код. $url передается из командной строки и представляет собой массив из нескольких URL-адресов (извините, что не опубликовал это изначально):

4 answers

Вы можете использовать комбинацию «—timeout» и time(). Начните с определения того, сколько у вас всего времени, и уменьшите время ожидания — по мере выполнения вашего сценария.

Примечание: если вы не используете -t, wget попробует 20 раз, каждый раз ожидая — секунд ожидания.

Вот пример кода, использующего proc_open/proc_terminate (предложение @Josh):

Попробуйте использовать аргумент командной строки wget —timeout в дополнение к set_time_limit() .

Имейте в виду set_time_limit(15) перезапускает счетчик времени ожидания с нуля, поэтому не вызывайте его внутри цикла (для вашей цели)

—время ожидания =секунды

Установите время ожидания сети в секундах секунд. Это эквивалентно указанию — dns-тайм-аут, —тайм-аут подключения и —тайм-аут чтения, все одновременно.

При взаимодействии с сеть, Wget может проверить время ожидания и прервать операцию, если она займет слишком много времени. Это предотвращает такие аномалии, как зависание чтения и бесконечные соединения. Единственный тайм-аут, включенный по умолчанию, — это 900-секундный тайм-аут чтения. Установка тайм-аута на 0 полностью отключает его. Если вы не знаете, что делаете, лучше не изменять настройки тайм-аута по умолчанию.

Все параметры, связанные с таймаутом, принимают десятичные значения, а также подсекундные значения. Например, 0,1 секунды — это законный (хотя и неразумный) выбор времени ожидания. Подсекундные тайм-ауты полезны для проверки времени отклика сервера или для тестирования задержки в сети.

РЕДАКТИРОВАТЬ: ХОРОШО. Я вижу, что ты сейчас делаешь. Что вам, вероятно, следует сделать, так это использовать proc_open вместо system и использовать функцию time() для проверки времени, вызывая proc_terminate, если wget работает слишком долго.

Вы можете направить вывод программы wget в файл, который затем немедленно возвращается.
Также смотрите:

Примечание: Функция set_time_limit() и директива конфигурации max_execution_time влияет только на время выполнения самого скрипта. Любое время, потраченное на действия, которые происходят вне выполнения сценария, такие как системные вызовы с использованием system(), потоковые операции, база данных запросы и т.д. не включаются при определении максимального времени что сценарий был запущен. Это не относится к окнам, где измеренное время является реальным.

Я думаю, что гораздо лучший способ — справиться с убийством в самой команде, по крайней мере, в Linux (Ubuntu 17.10). Никакие другие средства не помогали мне. proc_terminate из другого ответа сработало, но никаких выходных данных не будет.

Читайте так же:
Счетчик урона от протанки

В приведенном ниже примере я добавляю волшебную строку, которая проверяет, все ли еще выполняется ваш процесс. Если он выполняется дольше, чем $sec , он немедленно завершает процесс, оставляя заметку «Тайм-аут!».

Таким образом, я уверен, что команда не превысит время ожидания, и я получу все стандартный вывод/стандартный вывод, который мне нужен.

Как запустить долговыполнимый php-скрипт

Технологам моей фирмы часто приходится писать php-скрипты которые требуют большого времени выполнения. Многих php-кодеров такая задача как ни странно ставит в тупик, и сводится для них к оптимизации программы, или увеличения time-limit его запуска в апаче например. Тем ни менее никакая оптимизация не поможет если вам необходимо перегенерить тысячу превьюшек к фотографиям каталога магазина. Существуют пара на мой взгляд очевидных способов запускать такие скрипты.

Запуск командой через SSH

Это самый быстрый способ. Скрипт запущенный в командной строке сервера выполняется гораздо быстрее чем скрипт запущенный через Apache. Это как раз особенно заметно на генерации тысячи превьюшек.

В данном случае у вас может немного измениться местоположение папок и файлов если вы ведёте в скрипте запись в файлы. Это может быть тогда когда каталог запуска скрипта не совпадает с каталогом самого скрипта. Вам может помочь добавление такой строчки в начало вашего файла.

Запуск через Cron

Это примерно то же что и прямым вызовом команды php в ssh. Иногда доступа к ssh хостинг может не предоставлять, иногда в ssh может быть запрещён запуск php (по совершенно непонятным причинам как на хостинге J***.ru, хотя они обещают разрешить). Но запуск скриптов через крон как правило присутствует и в нём php тоже запускается. Например когда мы скачивали главные страницы всех сайтов рунета (2000000 штук) каждый десятый сайт наровил отнять минуту на загрузку, поэтому запуск такого скрипта в ssh был затянут надолго. Скачивая по пять сайтов в секунду кроном мы смогли скачать весь рунет всего за неделю. =)

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

Использовать её нужно примерно так:

Запуск через Apache

Да, да, во-многих случаях запустить скрипт через Apache быстрее чем дождаться пока выполниться крон, тем более когда нужно увидеть возвращаемые ошибки.

Принцип запуска примерно такой же как в кроне, т.е. запускать каждый этап скрипта отдельно. Если у вас есть цикл который целиком никак не влазиет в time-limit веб-сервера, но который вполне можно выполнить за несколько раз сделайте такое-же добавление к коду как для Cron выше, и после каждого выполнения действий с элементом цикла вызывайте такую функцию:

В данном случае вы можете обойтись без записи позиции в файл, а просто передавать её параметром $_GET, например так:

Вот и все секреты на сегодня. Следите за обновлениями через RSS.

Комментарии:

К варианту через апач мне еще нравится перезапуск яваскриптом делать — когда выводится “градусник”, то на каждый его тик очищаю предыдущий отсчет через clearTimeout и запускаю новый обратный отсчет через setTimeout. Так я могу не думать о том какой там таймаут у сервера, у меня перезапуск произойдет только по повисанию процесса. Я использую такую систему в своих плагинах для WordPressa — например база фильмов может постится от 10 минут до часа (зависит от хостера), но то что запостится полностью я уверен 🙂

Да. у нас среди php функций которые постоянно используются технологами тоже есть градусник (цвет меняет от зелёного к красному, в мае написала =))
Так и называются:
meta_page_refresh
old_page_refresh — с обратным отсчётом
page_refresh — градусник

Читайте так же:
Подключение многотарифного счетчика схема подключения

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

vremya-vypolneniya-skripta-php

Доброго времени суток, коллеги! 🙂

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

голоса
Рейтинг статьи
Ссылка на основную публикацию
Adblock
detector