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

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

Fatal error: Maximum execution time of 30 seconds exceeded in сайт.php on line 19

Я расскажу о 4-х способах, как избавиться от нее.

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

Увеличение времени выполнения PHP-скрипта через конфигурационный файл php.ini

В качестве первого способа для увеличения времени выполнения скрипта мы будем использовать файл конфигурации php.ini .

Для того чтобы точно узнать, где находится этот файл, прочитайте .

Открываете его удобным для вас способом и в самый низ вставляете:

Max_execution_time = 300;

Где «300 » означает 300 секунд (меняете на свое). Этот файл, к сожалению, не на всех хостингах доступен пользователям для редактирования.

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

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

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

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

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

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

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

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

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

Php_value max_execution_time 300

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

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

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

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

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

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

От автора: сын моего знакомого настолько увлекся химией, что начал дома проводить различные «испытания». После того, как их «жертвой» стала люстра на кухне, отец попросил его изменить свои пристрастия. В результате ребенок увлекся статистикой, и решил вычислить среднее время горения одной спички. Следствием чего чуть не стало возгорание всей квартиры. Я посоветовал «горе-ученому» заняться программированием, и установить время выполнения скрипта PHP.

Зачем измерения в программировании

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

Немного пофантазируем. Представим, что есть какой-то «самописный» движок, который разработчик «залил» на хороший хостинг и запустил (на его основе) свой сайт. Но почему-то загрузка ресурса на стороне пользователя происходит очень медленно.

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

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

Возможности PHP

Я всегда называл одним из самых удобных языков программирования. Чтобы отследить время работы кода, разработчику не требуется писать длинные «талмуды» для перехвата каждой строки скрипта. В данной технологии реализовано несколько специализированных средств. Главным из них является функция microtime(). Она возвращает время (в миллисекундах), прошедшее с начала 1970 г. Так называемое «начало эпохи Unix». Если передать функции параметр get_as_float со значением true, то она будет возвращать временной промежуток в виде целых секунд и дробных миллисекунд.

Принцип использования microtime() заключается в следующем: функцию вызывают в начале скрипта и в его конце. Затем из последнего значения вычитают начальное. Вот как посчитать время выполнения скрипт:

"; $last=microtime(true); $value=$last-$first; echo "Скрипт выполняется за: ".$value; ?>

Изменяем время работы кода

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

Это значит, что в настройках параметру max_execution_time задано значение по умолчанию (30 секунд). Увеличим максимальное время выполнения скрипта на PHP в 3 раза.

set_time_limit (90 ) ;

Теперь мы не получаем сообщения об ошибке.

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"ов.

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


Иногда требуется узнать время выполнения скрипта. И это можно сделать с помощью встроенных в язык 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") должно затрачиваться больше времени.

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

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

Fatal error: Maximum execution time of 30 seconds exceeded in pandoge_com.php on line 19

Я расскажу о 4-х способах, как избавиться от нее.

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

Увеличение времени выполнения PHP-скрипта через конфигурационный файл php.ini

В качестве первого способа для увеличения времени выполнения скрипта мы будем использовать файл конфигурации php.ini .

Для того чтобы точно узнать, где находится этот файл, прочитайте .

Открываете его удобным для вас способом и в самый низ вставляете:

Max_execution_time = 300;

Где «300 » означает 300 секунд (меняете на свое). Этот файл, к сожалению, не на всех хостингах доступен пользователям для редактирования.

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

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

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

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

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

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

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

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

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

Php_value max_execution_time 300

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

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

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

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

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

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

Эта статья также доступна на следующих языках: Тайский

  • Next

    Огромное Вам СПАСИБО за очень полезную информацию в статье. Очень понятно все изложено. Чувствуется, что проделана большая работа по анализу работы магазина eBay

    • Спасибо вам и другим постоянным читателям моего блога. Без вас у меня не было бы достаточной мотивации, чтобы посвящать много времени ведению этого сайта. У меня мозги так устроены: люблю копнуть вглубь, систематизировать разрозненные данные, пробовать то, что раньше до меня никто не делал, либо не смотрел под таким углом зрения. Жаль, что только нашим соотечественникам из-за кризиса в России отнюдь не до шоппинга на eBay. Покупают на Алиэкспрессе из Китая, так как там в разы дешевле товары (часто в ущерб качеству). Но онлайн-аукционы eBay, Amazon, ETSY легко дадут китайцам фору по ассортименту брендовых вещей, винтажных вещей, ручной работы и разных этнических товаров.

      • Next

        В ваших статьях ценно именно ваше личное отношение и анализ темы. Вы этот блог не бросайте, я сюда часто заглядываю. Нас таких много должно быть. Мне на эл. почту пришло недавно предложение о том, что научат торговать на Амазоне и eBay. И я вспомнила про ваши подробные статьи об этих торг. площ. Перечитала все заново и сделала вывод, что курсы- это лохотрон. Сама на eBay еще ничего не покупала. Я не из России , а из Казахстана (г. Алматы). Но нам тоже лишних трат пока не надо. Желаю вам удачи и берегите себя в азиатских краях.

  • Еще приятно, что попытки eBay по руссификации интерфейса для пользователей из России и стран СНГ, начали приносить плоды. Ведь подавляющая часть граждан стран бывшего СССР не сильна познаниями иностранных языков. Английский язык знают не более 5% населения. Среди молодежи — побольше. Поэтому хотя бы интерфейс на русском языке — это большая помощь для онлайн-шоппинга на этой торговой площадке. Ебей не пошел по пути китайского собрата Алиэкспресс, где совершается машинный (очень корявый и непонятный, местами вызывающий смех) перевод описания товаров. Надеюсь, что на более продвинутом этапе развития искусственного интеллекта станет реальностью качественный машинный перевод с любого языка на любой за считанные доли секунды. Пока имеем вот что (профиль одного из продавцов на ебей с русским интерфейсом, но англоязычным описанием):
    https://uploads.disquscdn.com/images/7a52c9a89108b922159a4fad35de0ab0bee0c8804b9731f56d8a1dc659655d60.png