Set time limit


Управление временем исполнения PHP-скрипта посредством серверного языка имеет значение для целей тестирования и оптимизации алгоритма обработки данных. По сути, серверный язык обеспечивает работу сайта, но не контролирует ее. С посетителем работает браузер, а это язык JavaScript, теги HTML и правила CSS. Однако правильно подготовить страницу и файлы для работы браузера — забота PHP.

Время работы PHP-скрипта

Тридцать секунд дается любому скрипту для выполнения работы, если иное не установлено в файле php.ini в директиве max_execution_time. Этот параметр можно изменить в файле инициализации и в коде скрипта.

Функция PHP set_time_limit(0) делает скрипт бесконечным. Любое, отличное от нуля, значение устанавливает ограничение на время исполнения, которое задается в секундах.

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

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

О безопасности и стабильности работы сайта


Если сайт построен на базе популярной системы управления сайтами, использует внешние JS-библиотеки, например, jQuery и передачу данных через AJAX, имеет место фактор внешней неопределенности.

Одно дело, когда разработчик написал сам серверный код (PHP) и функционал сайта (HTML, CSS, JavaScript). Совсем другое дело, когда управление систематически уходит в недра CMS или на удаленный сервер внешнего API (библиотеки, шаблона, фреймворка).

Использовать или нет функцию PHP set_time_limit() — дело предпочтений разработчика, но при наличии внешних факторов управление временем исполнения работы на сервере — залог безопасности и стабильности работы ресурса.

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

fb.ru

Ways to Change PHP program Execution Time

There are various ways to change the value of this directive that is set with the PHP configuration file. These are,


  1. Use PHP function set_time_limit() that accepts execution time limit in seconds as its argument.
  2. Search the php.ini file for a max_execution_time directive and edit its default value as required.
  3. Use ini_set() function in a PHP program by specifying php.ini file directive name and its corresponding value to be set.
  4. Use php_value command in .htaccess file to set max_execution_time.

set_php_execution_time_limit

set_time_limit()

This function is used to set the number of seconds a PHP program is allowed to be executed with a browser. For that, it accepts an integer value as an argument. For example, let us see the following line to explain further.

$execution_time_limit = 45;  set_time_limit($execution_time_limit);

We should paste the above two lines in our PHP program where it is required to change the configuration directive at run time. If use this function at the very beginning before we start another coding, then the value specified with this function will be the limit for program execution.

Otherwise, if we set this limit after some lines of code, then the execution time will be extended by this value with the number of seconds taken for the partial execution of the program.


To be very clear, let us consider set_time_limit is used in mid of the program with the value of 40 seconds. And the time taken to execute the code before invoking set_time_limit() is 20 seconds. Then, set_time_limit(40) allow the remaining execution to take the maximum limit of 40 seconds. And totally, the program has 60 seconds as its execution time limit.

Edit max_execution_time Directive

Instead of setting limits for PHP program execution at run time, we can directly change the corresponding directive value that is set with the PHP configuration file php.ini. But, this is possible, if we have access to modify this file, otherwise, we need to raise a manual request to whomsoever maintaining it.

If we have access to this file then we can see the settings related to max_execution_time, like.

; Maximum execution time of each script, in seconds  ; http://php.net/max-execution-time  ; Note: This directive is hardcoded to 0 for the CLI SAPI  max_execution_time = 30

And then we should replace the default value as required. To make the change with the config file to be effective, we need to restart the server before executing any PHP program.

ini_set()

This is another way to set execution time limit from PHP program as like as set_time_limit() function. This function accepts two arguments, one is the directive name and the value for other. For example, this limit is set by this function using the following line.


ini_set(“max_execution_time”,5);

The overall execution limit value for a PHP program depends on the position where we invoke ini_set() function in our program. The same calculation we have seen for example while seeing set_time_limit() is applicable to this function also.

Use php_value command in .htaccess

We can change the value of execution time limit with the .htaccess file by using the php_value command as like as follows.

php_value max_execution_time 200

Note:

  • All the above method for setting maximum execution limit are used for long running PHP program, like a program that uploads huge size files or on sending mail to multiple recipients and etc.
  • While using PHP functions like set_time_limit() and ini_set(), we need to ensure that the program is not running in safe mode. If so, these function will not create expected results.
  • And, if the time set by these above methods are elapsed the following PHP error will be sent to the browser.
    Fatal error: Maximum execution time of ... seconds exceeded  

↑ Back to Top

phppot.com


Ограничение времени работы внешних приложений

Всем привет! Давненько я не писал про интересные штуки при программировании на php. Сегодня я опишу один хак, который я нашел столкнувшись с проблемой запуска программ из php..

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

Например, так:

Получить результат работы в php можно так:

Создаем файл test.php с таким содержимым и запускаем его так из консоли:

Результатом работы будет следующий вывод:

Теперь поговорим о set_time_limit, данная функция, позволяет прервать выполнение скрипта, в случае если его время работы превысило время установленное в этой функции, самый простой пример на php может выглядеть так:

Вот какой будет результат:

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

Результат:

Как видите скрипт отработал 10 секунд и не был прерван, т.к. 10 секунд работала внешняя программа.

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


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

Подобного поведения можно добиться например таким скриптом:

Скрипт будет работать, пока Вы не нажмете Ctrl+C (разумеется если вы его запустите из консоли)

Как же можно решить такую проблему?

Есть несколько вариантов:

  • Делать вызовы через семейство pcntl функций, и отслеживать время работы.
  • Как-то ограничить время выполнения на стороне запуска внешней команды

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

Сделать это можно с помощью команды timeout вот так:

Формат команды timeout такой:


  • СИГНАЛ = сигнал который будет послан после времени указанного в ТАЙМАУТ_1. Обычно это SIGHUP или SIGTERM.
  • ТАЙМАУТ_1 = время после которого приложению будет послан сигнал SIGTERM, если не указан другой в пераметре -s. Время можно указывать с префикасми (s=секунда, m=минута, h=часы, d=дни), например: 20m = 20 минут
  • ТАЙМАУТ_2 = время после которого приложению будет послан сигнал SIGKILL, т.е. оно будет завершено. Начинает отсчитываться, после наступления ТАЙМАУТ_1. Т.е. время данное на завершение.
  • Команда возвращает код ошибки 124 в случае таймаута, либо код возвращения запущенной программы в случае если таймаута не было.

Результат:

Как видим через 10 секунд наша программа завершилась по таймауту, что нам и требовалось.

Есть еще один вариант, который я написал, до того, как нашел информацию о существовании команды timeout, вот он:

В принципе, он делает тоже самое, что и команда выше, только с более сложной записью.

Здесь мы делаем следующее:

  • Запускаем команду в фоне
  • Параллельно запоминаем PID запущенной команды в переменную
  • Далее ждем 5 секунд и отправляем приложению SIGTERM
  • После чего ждем еще 1 секунду и отправляем приложению SIGKILL

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

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

www.it-rem.ru

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


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

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

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

max_execution_time = 300;

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

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

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

<?php    	ini_set("max_execution_time", 300);  	  ?>

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

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

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

<?php    	set_time_limit(300);    ?>  

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

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

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

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

php_value max_execution_time 300

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

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

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

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

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

<?php    	echo ini_get("max_execution_time");  	  ?>

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


www.pandoge.com

Php set_time_limit

 

Php has a function called set_time_limit which can be used to dynamically adjust the maximum execution time permitted to a script. It allows specifying the time in seconds and limits the script execution time to that many seconds.

The set_time_limit function whenever called, effectively extends the script execution time by that many seconds. So if the script has already run for 15 seconds and set_time_limit(30) is called, then it would run for a total of 30+15 = 45 seconds. That’s how its designed to work.

The default time limit is generally 30 seconds and defined by the ‘max_execution_time’ option of php.ini
Use the ini_get function to get it.

ini_get('max_execution_time');   

To find out the time already consumed by php use the getrusage function

  $dat = getrusage();  echo $dat["ru_nswap"]; // number of swaps  echo $dat["ru_majflt"]; // number of page faults  echo $dat["ru_utime.tv_sec"]; // user time used (seconds)  echo $dat["ru_utime.tv_usec"]; // user time used (microseconds)    

However the function itself can show varying behaviour across different platforms and environments and conditions. The documentation mentions

The set_time_limit() function and the configuration directive max_execution_time only affect the execution time of the script itself. Any time spent on activity that happens outside the execution of the script such as system calls using system(), stream operations, database queries, etc. is not included when determining the maximum time that the script has been running. This is not true on Windows where the measured time is real.

This means that any kind of activity that happens outside the script will not be controllable by set_time_limit. For example if you connect to a remote server using the socket_connect function or any other function that uses socket, then the time spend in the system call (function provided by underlying operating system) to connect will not be controllable by set_time_limit. Although the moment the control returns to the php script, the time limit would take effect.

So lets say if you are trying to ensure that scripts do not run out of bounds using set_time_limit, then make sure that you handle outside script calls separately and do no rely on set_time_limit for them. Otherwise the entire purpose would be defeated since the script still has a scope to consume more time.

      

Unlimiting with set_time_limit

A different scenario is, when you try to remove time restrictions on the php script to keep it running for as long as it wants or till an error occurs. To set unlimited time call the set_time_limit function with 0 as the parameter

set_time_limit(0);  

But this will have different effects at different time. It would depend highly on how exactly the php script is being run.

If the script is being run from command line,

# /usr/bin/php /path/to/script.php

Then the time limit would be by default be 0 , means no time restriction. When running from apache, the max_execution_time is by default set to 30 seconds.

However when the script is run from a browser (that is inside an external environment like apache), and we need the php to keep outputting data to the browser, then php’s set_time_limit function is not the only one controlling how long the php script can run and output the data to the browser. The server setup can also impose time restrictions on the php script.

Php handlers

If you are running php as using apache mod_php then you can use set_time_limit(0) to remove execution time limits on the php script. This will work as expected in most situations.

However when php is being run via mod_fcgid or mod_fastcgi or a fastcgi process manager like php-fpm then the running environment will have its own time restrictions on the script. You would notice that even after setting set_time_limit to 0, the script would end after a specific amount of time. This will be the time restriction placed by the execution environment.

For example mod_fastcgi has an option called «-idle-timeout» which controls the idle time of the script. So if the script does not output anything to the fastcgi handler for that many seconds then fastcgi would terminate it. The setup is somewhat like this

Apache <-> mod_fastcgi <-> php processes

Same thing happens with mod_fcgid. It too has an inbuilt time restriction. Php FPM has the option called request_terminate_timeout that will terminate the process after that many seconds.

So next time, don’t be surprised when set_time_limit fails and check all php things properly.

www.binarytides.com


You May Also Like

About the Author: admind

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

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

Этот сайт использует Akismet для борьбы со спамом. Узнайте как обрабатываются ваши данные комментариев.