Php убрать лимит выполнения скрипта

set_time_limit

Задаёт время в секундах, в течение которого скрипт должен завершить работу. Если скрипт не успевает, вызывается фатальная ошибка. По умолчанию даётся 30 секунд, либо время, записанное в настройке max_execution_time в php.ini (если такая настройка установлена).

При вызове set_time_limit() перезапускает счётчик с нуля. Другими словами, если время ожидания изначально было 30 секунд, и через 25 секунд после запуска скрипта будет вызвана функция set_time_limit(20) , то скрипт будет работать максимум 45 секунд.

Список параметров

Максимальное время выполнения в секундах. Если задан ноль, время выполнения неограниченно.

Возвращаемые значения

Возвращает true в случае успешного выполнения, иначе false .

Примечания

Замечание:

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

Смотрите также

User Contributed Notes 25 notes

Both set_time_limit(. ) and ini_set(‘max_execution_time’. ); won’t count the time cost of sleep,file_get_contents,shell_exec,mysql_query etc, so i build this function my_background_exec(), to run static method/function in background/detached process and time is out kill it:

my_exec.php:
function my_background_exec ( $function_name , $params , $str_requires , $timeout = 600 )
< $map =array( '"' =>‘\»‘ , ‘$’ => ‘\$’ , ‘`’ => ‘\`’ , ‘\\’ => ‘\\\\’ , ‘!’ => ‘\!’ );
$str_requires = strtr ( $str_requires , $map );
$path_run = dirname ( $_SERVER [ ‘SCRIPT_FILENAME’ ]);
$my_target_exec = «/usr/bin/php -r \»chdir(‘ < $path_run >‘); < $str_requires >\\\$params=json_decode(file_get_contents(‘php://stdin’),true);call_user_func_array(‘ < $function_name >‘, \\\$params);\»» ;
$my_target_exec = strtr ( strtr ( $my_target_exec , $map ), $map );
$my_background_exec = «(/usr/bin/php -r \»chdir(‘ < $path_run >‘); < $str_requires >my_timeout_exec(\\\» < $my_target_exec >\\\», file_get_contents(‘php://stdin’), < $timeout >);\» my_timeout_exec ( $my_background_exec , json_encode ( $params ), 2 );
>

function my_timeout_exec ( $cmd , $stdin = » , $timeout )
< $start = time ();
$stdout = » ;
$stderr = » ;
//file_put_contents(‘debug.txt’, time().’:cmd:’.$cmd.»\n», FILE_APPEND);
//file_put_contents(‘debug.txt’, time().’:stdin:’.$stdin.»\n», FILE_APPEND);

$process = proc_open ( $cmd , [[ ‘pipe’ , ‘r’ ], [ ‘pipe’ , ‘w’ ], [ ‘pipe’ , ‘w’ ]], $pipes );
if (! is_resource ( $process ))
‘1’ , ‘stdout’ => $stdout , ‘stderr’ => $stderr );
>
$status = proc_get_status ( $process );
posix_setpgid ( $status [ ‘pid’ ], $status [ ‘pid’ ]); //seperate pgid(process group id) from parent’s pgid

stream_set_blocking ( $pipes [ 0 ], 0 );
stream_set_blocking ( $pipes [ 1 ], 0 );
stream_set_blocking ( $pipes [ 2 ], 0 );
fwrite ( $pipes [ 0 ], $stdin );
fclose ( $pipes [ 0 ]);

if ( time ()- $start > $timeout )
< //proc_terminate($process, 9); //only terminate subprocess, won't terminate sub-subprocess
posix_kill (- $status [ ‘pid’ ], 9 ); //sends SIGKILL to all processes inside group(negative means GPID, all subprocesses share the top process group, except nested my_timeout_exec)
//file_put_contents(‘debug.txt’, time().»:kill group \n», FILE_APPEND);
return array( ‘return’ => ‘1’ , ‘stdout’ => $stdout , ‘stderr’ => $stderr );
>

$status = proc_get_status ( $process );
//file_put_contents(‘debug.txt’, time().’:status:’.var_export($status, true).»\n»;
if (! $status [ ‘running’ ])
< fclose ( $pipes [ 1 ]);
fclose ( $pipes [ 2 ]);
proc_close ( $process );
return $status [ ‘exitcode’ ];
>

usleep ( 100000 );
>
>
?>

a_class.php:
class A
static function jack ( $a , $b )
< sleep ( 4 );
file_put_contents ( ‘debug.txt’ , time (). «:A::jack:» . $a . ‘ ‘ . $b . «\n» , FILE_APPEND );
sleep ( 15 );
>
>
?>

test.php:
require ‘my_exec.php’ ;

my_background_exec ( ‘A::jack’ , array( ‘hello’ , ‘jack’ ), ‘require «my_exec.php»;require «a_class.php»;’ , 8 );
?>

Источник

Установка лимитов PHP на обработку данных из форм

Перечень настроек PHP, которые могут ограничить отправку форм и файлов через POST-запрос.

Описание директив

post_max_size

Устанавливает максимальный размер данных, отправленных методом POST, включая размер загружаемых файлов, по умолчанию 8Mb .

  • Для загрузки больших файлов это значение должно быть больше значения upload_max_filesize.
  • Значение можно указать числом в байтах, K (в килобайтах), M (в мегабайтах) и G (в гигабайтах).
  • Значение «0» снимает ограничение только в версиях PHP 5.3.2 и 5.2.12.

Пример в htaccess:

php_value post_max_size 100M

upload_max_filesize

Максимальный размер загружаемых файлов на сервер. По умолчанию 2Mb.

Пример:

php_value upload_max_filesize 100M

max_input_vars

Максимальное количество переменных, которое может быть принято в одном запросе. По умолчанию 1000.

Если данный лимит будет превышен, то после отправки формы массив $_GET или $_POST будет пустым.

Пример:

php_value max_input_vars 2000

max_execution_time

Директива задаёт максимальное время в секундах, в течение которого скрипт должен полностью загрузиться. Если этого не происходит, работа скрипта завершается. По умолчанию на загрузку даётся 30 секунд.

Значение «0» снимает ограничение на время выполнения.

Пример:

php_value max_execution_time 600

Также, максимальное время выполнения скрипта задает функция set_time_limit($seconds) .

max_input_time

Задаёт максимальное время в секундах, в течение которого скрипт должен разобрать все входные POST или GET данные. Это время измеряется от момента, когда PHP вызван на сервере до момента, когда скрипт начинает выполняться.

  • Значение по умолчанию «-1» – будет использоваться max_execution_time.
  • Значение «0» – без ограничений по времени.

Пример:

php_value max_input_time 600

memory_limit

Задаёт максимальный объем памяти в байтах, который разрешается использовать скрипту. По умолчанию 128Mb.

Пример:

php_value memory_limit 200M

Установка директив в .htaccess

# Максимальный размер данных php_value post_max_size 110M # Максимальный размер файлов php_value upload_max_filesize 100M # Максимальное количество переменных php_value max_input_vars 2000 # Максимальное время выполнения скрипта php_value max_execution_time 600 # Максимальное время обработки данных php_value max_input_time 600 # Память для скрипта php_value memory_limit 200M 

Установка директив в PHP-скрипте

ini_set('post_max_size', '110M'); // Максимальный размер данных ini_set('upload_max_filesize', '100M'); // Максимальный размер файлов ini_set('max_input_vars', '2000'); // Максимальное количество переменных ini_set('max_execution_time', '600'); // Максимальное время выполнения скрипта ini_set('max_input_time', '600'); // Максимальное время обработки данных ini_set('memory_limit', '200M'); // Память для скрипта

Получение значений в PHP-скрипте

Действующие значения настроек PHP можно посмотреть с помощью функции phpinfo() или получить значение параметра настройки с помощью функции ini_get($option) .

Получение значения upload_max_filesize в PHP:

'; echo 'Максимальный размер файлов: ' . ini_get('upload_max_filesize') . '
'; echo 'Максимальное количество переменных: ' . ini_get('max_input_vars') . '
'; echo 'Максимальное время выполнения скрипта: ' . ini_get('max_execution_time') . '
'; echo 'Максимальное время обработки данных: ' . ini_get('max_input_time') . '
'; echo 'Память для скрипта: ' . ini_get('memory_limit') . '
';

Результат:

Максимальный размер данных: 128M Максимальный размер файлов: 128M Максимальное количество переменных: 10000 Максимальное время выполнения скрипта: 300 Максимальное время обработки данных: -1 Память для скрипта: 1024M

Возможные ошибки

После отправки формы с множеством полей, массив $_POST пустой.
В форме количество полей превышает значение max_input_vars.

Ошибка «Fatal error: Allowed memory size»
Скрипт превысил значение параметра PHP memory_limit.

Ошибка «504 Gateway Time Out»
– Скрипт выполняется слишком долго, нужно увеличить значение max_execution_time. Как правило после вывода этой ошибки в браузере, скрипт будет еще какое-то время работать.

Источник

как обойти ограничение max_execution_time в php?

есть сервер, на котором max_execution_time выставлен в 30 секунд. условимся, что изменить его значение нельзя. стоит задача на таком сервере выполнять тяжелые вычисления (например, парсинг множества страниц), которые могут занять несколько часов времени. как можно решить такую проблему? может есть готовые примеры на github или еще где-нибудь? приходит в голову использовать периодические ajax запросы на скрипт, который будет обрабатывать данные небольшими порциями (чтобы уложиться в ограничения). там можно и прогресс-бар сделать с результатами работы. в связи с этим возникают вопросы — что будет с js кодом, отправляющим ajax запросы, если вкладка браузера станет неактивной? слышал, что выполнение js кода может быть приостановлено. также хотелось бы, чтобы решение работало и на мобильных браузерах тоже — там же могут быть свои детали работы js на неактивных вкладках. в общем, посоветуйте наилучший вариант реализации

1 ответ 1

Если оно задано хостинг-провайдером в настройках, то никак. Master значение всегда главнее пользовательского.

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

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

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

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

Более подробную информацию ищите в Google про очереди задач, это здесь очень часто обсуждается.

Другой вариант использовать библиотеки которые позволяют создавать дополнительные потоки для PHP скрипта и этим получать многократное увеличение производительности (pthreads и другие)

P.S. Не поскупитесь на VPS сервер, они сейчас не такие дорогие, чтобы выполнять вашу задачу в разы быстрее и иметь полный контроль над своим сервером.

Источник

Читайте также:  Php что значит включить файл
Оцените статью