Php ограничение времени работы скрипта

Как увеличить память и время для PHP скриптов

Настройки потребления ресурсов в PHP скриптах можно установить в главном конфигурационном файле php.ini, а также в самих скриптах.

В файле php.ini за это отвечают директивы из раздела Resource Limits (ограничение потребления ресурсов).

Как увеличить память для PHP скриптов

Для этого в файле php.ini найдите и отредактируйте директиву:

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

На максимальное время выполнения не влияют системные вызовы, потоковые операции и т.п.

При работе в безопасном режиме эту настройку нельзя изменить функцией ini_set(). Если значение все же нужно изменить, надо либо выключить безопасный режим, либо изменить значение прямо в php.ini.

Веб-серверы обычно имеют свои настройки тайм-аута, по истечении которого сами завершают выполнение скрипта PHP. В Apache есть директива Timeout, в IIS есть функция CGI timeout. В обоих случаях по умолчанию установлено 300 секунд. Точные значения можно узнать из документации к веб-серверу.

Функция для увеличения и ограничения времени выполнения PHP

Функция set_time_limit ограничивает время выполнения скрипта.

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

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

  • СЕКУНДЫ (максимальное время выполнения в секундах. Если задан ноль, время выполнения неограничено)

Возвращаемые значения: возвращает TRUE в случае успеха, иначе FALSE.

Внимание: эта функция не работает, если PHP работает в безопасном режиме. Обойти это ограничение можно только выключив безопасный режим или изменив значение настройки в php.ini.

Читайте также:  Python solve differential equation system

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

Обе set_time_limit(…) и ini_set(‘max_execution_time’,…); не учитывают время, потраченное функциями sleep, file_get_contents, shell_exec, mysql_query и некоторыми другими.

Увеличение выделенной памяти для PHP скриптов

Директива в файле php.ini

задаёт максимальный объем памяти в байтах, который разрешается использовать скрипту. Это помогает предотвратить ситуацию, при которой плохо написанный скрипт съедает всю доступную память сервера. Для того, чтобы убрать ограничения, установите значение этой директивы в -1.

В версиях до PHP 5.2.1 для использования этой директивы, она должна была быть указана на этапе компиляции. Так, ваша строка конфигурации должна была включать: —enable-memory-limit. Эта опция компиляции была также необходима для использования функций memory_get_usage() и memory_get_peak_usage() до версии 5.2.1.

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

Доступные опции: K (для килобайт), M (для мегабайт) и G (для гигабайт; доступна начиная с PHP 5.1.0); они регистронезависимы. Все остальное считается байтами. 1M равно одному мегабайту или 1048576 байтам. 1K равно одному килобайту или 1024 байтам. Эти сокращения вы можете использовать в php.ini и в функции ini_set(). Обратите внимание, что числовое значение приводится к типу integer; например, 0.5M интерпретируется как 0.

Увеличение времени парсинга данных из запроса.

Директива в файле php.ini

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

При запуске в командной строке значение директивы установлено на -1 (неограниченно).

Увеличение глубины вложенности входных переменных

Директива в файле php.ini

;max_input_nesting_level = 64

задаёт максимальную глубину вложенности входных переменных (то есть $_GET, $_POST.). По умолчанию данная директива закомментирована.

Ограничение на количество входных переменных

Директива в файле php.ini

определяет, входных переменных может быть принято в одном запросе (ограничение накладывается на каждую из глобальных переменных $_GET, $_POST и $_COOKIE отдельно). Использование этой директивы снижает вероятность сбоев в случае атак с использованием хеш-коллизий. Если входных переменных больше, чем задано директивой, выбрасывается предупреждение E_WARNING, а все последующие переменные в запросе игнорируются. По умолчанию данная директива закомментирована.

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

Читайте также:  Получить процент от числа python

Проверка использование ресурсов

Функция getrusage получает информацию об использовании текущего ресурса.

Возвращаемые значения: возвращает ассоциативный массив, содержащий данные возвращённые из системного вызова. Имена элементов соответствуют документированным именам полей.

Пример использования getrusage():

'; echo 'Количество операций приема блока: ' . $dat["ru_inblock"] . '
'; echo 'Количество отправленных сообщений IPC: ' . $dat["ru_msgsnd"] . '
'; echo 'Количество принятых сообщений IPC: ' . $dat["ru_msgrcv"] . '
'; echo 'Наибольший размер установленной резидентной памяти: ' . $dat["ru_maxrss"] . '
'; echo 'Суммарное значение размера разделяемой памяти: ' . $dat["ru_ixrss"] . '
'; echo 'Суммарное значение размера неразделяемых данных: ' . $dat["ru_idrss"] . '
'; echo 'Количество исправленных страниц (легкая ошибка страницы): ' . $dat["ru_minflt"] . '
'; echo 'Количество ошибочных страниц (тяжелая ошибка страницы): ' . $dat["ru_majflt"] . '
'; echo 'Количество полученных сигналов: ' . $dat["ru_nsignals"] . '
'; echo 'Количество согласованных переключений контекста: ' . $dat["ru_nvcsw"] . '
'; echo 'Количество несогласованных переключений контекста: ' . $dat["ru_nivcsw"] . '
'; echo 'Количество свопов: ' . $dat["ru_nswap"] . '
'; echo 'Время на задачи пользователя (user time) (микросекунды): ' . $dat["ru_utime.tv_usec"] . '
'; echo 'Время на задачи пользователя (user time) (секунды): ' . $dat["ru_utime.tv_sec"] . '
'; echo 'Время на системные задачи (system time) (микросекунды): ' . $dat["ru_stime.tv_usec"] . '
';

Увеличение разрешённого размера файлов для загрузки на сервер

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

устанавливает максимальный размер закачиваемого файла.

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

Максимально допустимый размер данных, отправляемых методом POST

Методом пост могут отправляться как текстовые данные (например, при отправке комментария на сайт), так и файлы. Если вы увеличили значение upload_max_filesize чтобы иметь возможность загружать файлы большего размера на сайт, то также нужно увеличить и значение директивы:

которая устанавливает максимально допустимый размер данных, отправляемых методом POST. Это значение также влияет на загрузку файлов. Для загрузки больших файлов это значение должно быть больше значения директивы upload_max_filesize. В сущности, memory_limit должна быть больше чем post_max_size. Если используется integer, значение измеряется байтами. Вы также можете использовать сокращённую запись, которая описана выше. Если размер POST-данных больше чем post_max_size, суперглобальные переменные $_POST и $_FILES будут пустыми. Это можно отследить различными способами, например передав $_GET переменную в скрипт, обрабатывающий данные, т.е. , а затем проверить, установлена ли переменная $_GET[‘processed’].

Замечание: PHP разрешает сокращения значений байт, включая K (кило), M (мега) и G (гига). PHP автоматически преобразует все эти сокращения. Будьте осторожны с превышением диапазона 32-битных целых значений (если вы используете 32-битную версию), так как это приведёт к ошибке вашего скрипта.

Для полного снятия лимитов значение можно установить на 0.

Читайте также:  Php xmlreader xml примеры

Значение этой настройки игнорируется, если чтение данных POST отключено с помощью enable_post_data_reading.

Увеличение количества файлов, выгружаемых на сайт за один раз

устанавливает максимально разрешённое количество одновременно закачиваемых файлов. Начиная с PHP 5.3.4, пустые поля загрузки не рассматриваются этим ограничением.

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

Связанные статьи:

Источник

doctor Brain

Практически каждый из нас хоть раз встречался с фатальной ошибкой, обусловленной тем, что на выполнение PHP-скрипта не хватало времени — это было больно и обидно. По умолчанию в настройках PHP на выполнение скрипта отводится 30 секунд, но в некоторых случаях для этого требуется больше времени. В таком случае на помощь приходит встроенная функция ini_set(), которая принимает два строковых параметра: наименование настройки конфигурации PHP и новое значение настройки. В нашем случае первым параметром будет ‘max_execution_time’, а вторым — новое значение максимального времени выполнения скрипта в секундах.

Как увеличить время выполнения только для одного скрипта?

Для того, чтобы быстро исправить ситуацию с “тяжелым” скриптом, достаточно добавить код приведенный ниже в его начало:

ini_set('max_execution_time', 120); // 120 секунд = 2 минуты, можно заменить на любое требуемое время в секундах 

В данном случае следует обратить внимание на пару моментов:

  1. строка с кодом, изменяющим настройки, должна находиться в самом начале скрипта, в противном случае есть риск запуска скрипта с настройками по умолчанию, установленными в файле php.ini,
  2. изменения настроек будут касаться только той странице, на которой присутствует ini_set.

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

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

ini_set('max_execution_time', 0); // 0 = бесконечное выполнение скрипта 

Как изменить время выполнения скрипта глобально?

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

  1. найдите папку с действующим ядром PHP,
  2. найдите актуальный файл php.ini и откройте его для редактирования,
  3. найдите строку, содержащую max_execution_time=30,
  4. замените 30 на нужное Вам значение в секундах,
  5. сохраните и закройте файл,
  6. перезапустите веб-сервер, для того чтобы изменения вступили в силу.

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

Новые публикации

Photo by CHUTTERSNAP on Unsplash

JavaScript: сохраняем страницу в pdf

HTML: Полезные примеры

Источник

Оцените статью