Apache время выполнения скрипта

Предыстория: с некоторых пор на сайте Х стали накапливаться процессы apache в состоянии отправки ответа, в логах никакого криминала не было обнаружено. Доблестные админы пытались спасти ситуацию тюнингом конфигов apache
ginxmysql и всего что было связано с сайтом Х. Никаких результатов это не дало. Был реализован план Б, в забиксе был добавлен скрипт рестарта apache при накоплении более 100 процессов apache.

Такая ситуация меня очень заинтересовала, так как все это время я верил в миф про настройки всевозможных таймаутов, и думал что проблема плевая и решить её возможно с помощью правильно приготовленного конфига. Небольшие исследование привели к факту полного отсутствия возможностей как в PHP так и в Apache ограничения времени обработки самого запроса, да у Apache есть таймауты на операции вводавывода но они срабатывают до и после самой обработки запроса. Пресловутая настройка max_execution_time весьма синтетическая, так как контроль этого параметра происходит при обработки оп кодов PHP, как и вариант с register_tick_function. Тоесть если в PHP скрипте есть зависшая операция вводавывода (mysql сервер во время обработки запроса сбойнул и не прислал ответа, да бывает и такое), команда sleep, и прочие неизвестные полтергейст которых полно в больших проектах писаные несколькими поколениями разработчиков, то процесс apache будет висеть в памяти бесконечно долго и не будет обрабатывать входящие запросы.

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

Читайте также:  Укп 9м принципиальная схема

плюсы — решение из коробки не страшно пускать в продакшен

минусы — перестройка проекта ( переделка .htaccess’ов под nginx либо прикручивание к apache fastcgi модуля),
не возможность узнать где произошло зависание

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

минусы — модуль хоть и примитивный ( пару функций ), может себя крайне интересно и непредсказуемо повести в продакшене

Итог: на одном из бекенд серверов будет использован второй вариант.

Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.

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

[Thu Nov 10 00:07:48 2011] [error] [client 127.0.0.1] PHP Fatal error: Maximum execution time of 30 seconds exceeded in /var/www/xxx/SOM.inc on line 291

Где можно увеличить время выполнения?

4 ответа 4

Если поставить в 0, к тому же, ограничение на время выполнения скрипта вообще отсутствует.

В php.ini прописать:

Только это не панацея — через 60 сек некоторые броузеры разрывают соединение, и тогда apache прибивает процесс

Попробуй в php php ini_set("max_execution_time", "60"); или файл .htaccess -> php_value max_execution_time 60 .

Для увеличения времени работы скрипта, в начале кода пропишите вот это (где цифры это время выполнения скрипта в секундах)

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

Читайте также:  Слежка за андроид с айфона

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Читайте также:  Полотенцесушитель электрический equation ламара 400х740 мм хром

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

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

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

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

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

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

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

Оцените статью
Добавить комментарий

Adblock
detector