- Увеличить время выполнения скрипта (PHP)
- set_time_limit()
- ini_set()
- php.ini
- htaccess
- Заключение
- Категории
- Читайте также
- Комментарии
- Вход на сайт
- Социальные сети
- set_time_limit
- Список параметров
- Возвращаемые значения
- Примечания
- Смотрите также
- User Contributed Notes 25 notes
- doctor Brain
- Как увеличить время выполнения только для одного скрипта?
- Как установить бесконечное время выполнения скрипта?
- Как изменить время выполнения скрипта глобально?
- Новые публикации
- JavaScript: сохраняем страницу в pdf
- HTML: Полезные примеры
- Время выполнения скрипта PHP и потребляемая память
- Время выполнения скрипта
- Способ #1
- Способ #2
- Способ #3
- Способ #4
- Класс для получения времени выполнения скрипта
- Объем использованной памяти
- Конвертация результата в килобайты и мегабайты
- Время выполнения скрипта и объём потреблённой памяти
- Время выполнения скрипта и объём потреблённой памяти в Yii2
Увеличить время выполнения скрипта (PHP)
Увеличить время выполнения скрипта можно четырьмя способами. Два способа при помощи PHP функций ( set_time_limit(int seconds) и ini_set(string varname, string newvalue)), при помощи настроек файла php.ini или использования файла .htaccess .
set_time_limit()
Самый простой и быстрый способ использовать вначале выполнения скрипта функции void set_time_limit( int seconds ) , которая меняет значение параметра max_execution_time , установленное в файле php.ini (Значение устанавливается в секундах, по-умолчанию 30 секунд).
ini_set()
Второй способ позволяет менять настройки файла php.ini — функция ini_set(string varname, string newvalue)) .
Примечание: функцию ini_set() не получится использовать, если PHP запущен в безопасном режиме.
php.ini
Если у вас есть доступ к настройкам файла php.ini , то в нем можно изменить настройку max_execution_time.
htaccess
Третий способ при помощи прописания параметров в файле .htaccess .
Заключение
На некоторых хостингах отключают возможность изменять значение max_execution_time , а вообще этот параметр лучше оставить в покое и хорошенько оптимизировать скрипты.
Категории
Читайте также
- Как увеличить объем загружаемого файла (PHP)
- Включить-отключить вывод ошибок (PHP)
- Время выполнения скрипта (PHP)
- Дата вчера сегодня завтра (PHP)
- Конвертировать миллисекунды в time.Time (GoLang)
- Первые N символов строки цифры (PHP)
- Преобразовать дату в секунды (PHP)
- isset vs array_key_exists (PHP)
- Количество секунд от начала дня (PHP)
- foreach vs array_walk (PHP)
- Singleton Trait (PHP)
- Редирект (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 );
?>
doctor Brain
Практически каждый из нас хоть раз встречался с фатальной ошибкой, обусловленной тем, что на выполнение PHP-скрипта не хватало времени — это было больно и обидно. По умолчанию в настройках PHP на выполнение скрипта отводится 30 секунд, но в некоторых случаях для этого требуется больше времени. В таком случае на помощь приходит встроенная функция ini_set(), которая принимает два строковых параметра: наименование настройки конфигурации PHP и новое значение настройки. В нашем случае первым параметром будет ‘max_execution_time’, а вторым — новое значение максимального времени выполнения скрипта в секундах.
Как увеличить время выполнения только для одного скрипта?
Для того, чтобы быстро исправить ситуацию с “тяжелым” скриптом, достаточно добавить код приведенный ниже в его начало:
ini_set('max_execution_time', 120); // 120 секунд = 2 минуты, можно заменить на любое требуемое время в секундах
В данном случае следует обратить внимание на пару моментов:
- строка с кодом, изменяющим настройки, должна находиться в самом начале скрипта, в противном случае есть риск запуска скрипта с настройками по умолчанию, установленными в файле php.ini,
- изменения настроек будут касаться только той странице, на которой присутствует ini_set.
Как установить бесконечное время выполнения скрипта?
Если невозможно определиться, сколько секунд требуется на выполнение определенного скрипта, Вы можете сбросить временные ограничения. Безусловно, это плохая практика, но такой подход оправдан во время разработки и тестирования проекта. И, конечно, не забудьте отменить такую настройку при переносе проекта на бой.
ini_set('max_execution_time', 0); // 0 = бесконечное выполнение скрипта
Как изменить время выполнения скрипта глобально?
Проблему времения выполнения скриптов можно решить глобально, внеся соответствующие изменения в файл настроек php.ini. Для этого необходимо сделать следующее:
- найдите папку с действующим ядром PHP,
- найдите актуальный файл php.ini и откройте его для редактирования,
- найдите строку, содержащую max_execution_time=30,
- замените 30 на нужное Вам значение в секундах,
- сохраните и закройте файл,
- перезапустите веб-сервер, для того чтобы изменения вступили в силу.
Изменение настроек времени выполнения скрипта должно быть оправданным и хорошо обдуманным шагом, особенно для боевых проектов. В определенных случаях увеличение времени выполнения скрипта спасет весь проект, но не стоит забывать о ситуациях, в которых столь, казалось бы, незначительное изменение становится бомбой замедленного действия и может все погубить. Будьте внимательны.
Новые публикации
JavaScript: сохраняем страницу в pdf
HTML: Полезные примеры
Время выполнения скрипта PHP и потребляемая память
Несколько способов узнать время выполнения скрипта PHP и затраченный объем памяти при выполнении этого скрипта.
Время выполнения скрипта
Способ #1
Функция microtime() с переданным значением true возвращает число секунд, прошедших с полуночи 01.01.1970 , причём это значение подсчитано до сотых долей секунды. Затем идёт сам скрипт (исполняемый код), который мы и проверяем. В последней строкой будет разница между текущим временем (после выполнения скрипта) и тем, что мы зафиксировали при старте скрипта. Разница времени после выполнения скрипта и времени до начала его работы, и есть время выполнения скрипта.
$start = microtime(true); // исполняемый код . echo '
==============================================================='; echo 'Время выполнения скрипта: ' . (microtime(true) - $start) . ' sec.';
Время выполнения скрипта: 0.16499996185303 sec.
Способ #2
Можно вместо $start = microtime(true) брать значение из переменной $_SERVER[‘REQUEST_TIME_FLOAT’] , которая содержит время запроса к серверу. Вычисление времени выполнения происходит за исполняемым кодом.
// исполняемый код . $time = microtime(true) - $_SERVER['REQUEST_TIME_FLOAT']; echo $time . ' sec.';
Способ #3
Если на сервере установлен Xdebag :
// исполняемый код . echo xdebug_time_index() . ' sec.';
Способ #4
Можно подсчитать среднее значение выполнения скрипта и записать результат в логи:
$start = microtime(true); // исполняемый код . $time = round(microtime(true) - $start, 3); $f = fopen('time.log', 'a'); fwrite($f, $time . PHP_EOL); fclose($f); $log = file('time.log'); $result = round(array_sum($log) / count($log), 3); echo $result . ' sec.';
Класс для получения времени выполнения скрипта
Очень простой класс, который можно использовать для получения времени выполнения скрипта PHP. Имеет приватное статическое свойство $start , в которой будет храниться время начала выполнения скрипта и имеющее значение по умолчанию $start = .0 . Метод start() присваивает значение, которое вернула функция microtime свойству $start . Метод finish() возвращает разницу между текущим временем (после выполнения скрипта) и тем, что мы зафиксировали при старте скрипта (присвоили значение в $start ).
/** * Разница между текущей меткой времени и меткой self::$start * @return float */ public static function finish() < return microtime(true) - self::$start; >>
Timer::start(); // исполняемый код . echo 'Время выполнения скрипта: ' . Timer::finish() . ' sec.'; // =================================== // Пример использования класса Timer(). Заполним массив миллионом случайных чисел. Timer::start(); for ($i = 0; $i < 1000000; $i++) < $array[] = rand(0, 1000000); >echo 'Время выполнения скрипта: ' . Timer::finish() . ' sec.';
Объем использованной памяти
Функция memory_get_usage() возвращает количество памяти в байтах, которое было выделено PHP скрипту на данный момент.
Принцип очень похож на измерение времени выполнения скрипта, о котором речь шла выше. Здесь тоже есть, как бы, стартовое состояние и и разница между текущим состоянием и стартовым.
$memory = memory_get_usage(); // исполняемый код . echo 'Скушано памяти: ' . (memory_get_usage() - $memory) . ' байт';
В Xdebug есть функция xdebug_memory_usage() , которая возвращает тот же результат.
// исполняемый код . echo 'Скушано памяти: ' . xdebug_memory_usage() . ' байт';
Скушано памяти: 36018960 байт
Конвертация результата в килобайты и мегабайты
$memory = memory_get_usage(); for ($i = 0; $i < 1000000; $i++) < $array[] = rand(0, 1000000); >$memory = memory_get_usage() - $memory; // Конвертация результата в килобайты и мегабайты $i = 0; while (floor($memory / 1024) > 0) < $i++; $memory /= 1024; >$name = array('байт', 'КБ', 'МБ'); echo 'Скушано памяти: ' . round($memory, 2) . ' ' . $name[$i];
Время выполнения скрипта и объём потреблённой памяти
Timer::start(); $memory = memory_get_usage(); // начало исполняемого кода for ($i = 0; $i < 1000000; $i++) < $array[] = rand(0, 1000000); >// конец исполняемого кода $memory = memory_get_usage() - $memory; $name = array('байт', 'КБ', 'МБ'); $i = 0; while (floor($memory / 1024) > 0) < $i++; $memory /= 1024; >echo 'Время выполнения скрипта: ' . Timer::finish() . ' sec.
'; echo 'Скушано памяти: ' . round($memory, 2) . ' ' . $name[$i];
Время выполнения скрипта: 0.79099988937378 sec. Скушано памяти: 34 МБ
Время выполнения скрипта и объём потреблённой памяти в Yii2
Вывести время выполнения скрипта и объём потреблённой памяти в Yii2:
echo 'getElapsedTime()) , 'с. ' . round(memory_get_peak_usage()/(1024*1024), 2) . 'МБ -->';