В этой версии Web-cepвepa с предварительным ветвлением внесены все необходимые изменения для упорядочения вызовов функции accept () и перезапуска дочерних процессов в целях замены завершившихся. Подобная конструкция вполне может применяться на высоконагруженных проектах сети, например, uCoz . Обеспечено также корректное уничтожение родительским процессом дочерних процессов при завершении работы сервера. Проведем анализ программы.
Строки 1-7. Импортирование модулей. Кроме модулей, импортируемых в предыдущих версиях, импортируется модуль Fcntl. Он экспортирует несколько констант, необходимых для установки и снятия блокировки файла.
Строки 8-11. Определение констант. Кроме prefork_children и pidfile, определяется константа max_request. Она устанавливает число транзакций, которые должны быть выполнены каждым дочерним процессом перед завершением его работы. Установка небольшого значения этой константы позволяет следить за тем, как завершается работа дочерних процессов и выполняется запуск родительским процессом новых дочерних процессов для замены завершившихся. Определена также переменная debug, которую можно установить для записи в журнал подробных сообщений.
Строки 12,13. Объявление глобальных переменных. Введена новая переменная $child_count, которая обозначает число дочерних процессов, активных в любое заданное время. Переменная $done, как и прежде, применяется для указания родительскому процессу, что настало время завершить работу.
Строка 14. Обработчики сигналов. Обработчики int и term принимают запросы на завершение работы сервера. Как и прежде, обязанности по установке обработчика сигнала CHLD возлагаются на модуль Daemon.