Menu
Categories
OpenWrt: исправление php5-fastcgi.init
April 20, 2012 Сеть и интернет

Современный скрипт для запуска php-fcgi имеет одну неприятную особенность, связанную с используемыми интерпретатором параметрами по умолчанию – спустя некоторое время после запуска он внезапно тихо умирает.

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

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

Посмотрим на фрагмент скрипта /etc/init.d/php5-fastcgi, отвечающий за запуск сервиса:

...
PHP_FCGI_CHILDREN='' \
service_start /usr/bin/php-fcgi -b $port
...

Любопытно то, что здесь пытаются передать запускаемому интерпретатору пустой параметр PHP_FCGI_CHILDREN, который определяет количество запускаемых процессов. Однако, к сожеланию, передача в такой форме до цели не дойдет. Поэтому даже если мы захотим запускать более одного процесса, то такое редактирование работать не будет:

...
PHP_FCGI_CHILDREN=2 \
service_start /usr/bin/php-fcgi -b $port
...

Вместо этого необходимо воспользоваться командой export для того, чтобы php-fcgi сумел увидеть нашу переменную:

...
export PHP_FCGI_CHILDREN=2
service_start /usr/bin/php-fcgi -b $port
...

Если же мы хотим отключить ограничение на число обрабатываемых запросов, нам следует объявить и приравнять к нулю переменную PHP_FCGI_MAX_REQUESTS. Тогда запуск сервиса может выглядеть так:

...
export PHP_FCGI_CHILDREN=0
export PHP_FCGI_MAX_REQUESTS=0
service_start /usr/bin/php-fcgi -b $port
...

Таким образом мы объявляем интерпретатору, что не хотим запускать отдельных рабочих процессов, и что никаких ограничений по числу обрабатываемых запросов быть не должно. При данной настройке php-fcgi должен перестать убиваться с течением времени без видимых на то причин.

"2" Comments
  1. Спасибо за скрипт! Реально помогло. Я уже было чуть не закинул Nginx php-cgi связку, так как при большой нагрузке php-cgi просто вылетал…. После поправки скрипта все работает стабильно! Еще раз спасибо!

  2. спасибо. оч помогло

Leave a Reply




*