Один порт для нескольких воркеров phpDaemon

Сегодня разбирались с демонизацией Zend Framework приложения на базе phpDaemon. При тестировании возникла одна проблема – при старте демона и обработке запроса на одном порту мог висеть только один демон.При увеличении параметров max-workers и start-workers вылетали ошибки вида “Couldn’t bind TCP-socket”. Пробовали вариант с созданием нескольких демонов на разных портах и балансировкой их через nginx. Вариант рабочий, но всё равно на порту сидел только один демон.

Всё дело в том, что демон может открывать блокирующий или неблокирующий сокет, в первом случае на нём висит только один воркер, а во втором – сколько угодно. Сделать сокет неблокирующим можно командой socket_set_nonblock($socket) или использую параметр SO_REUSEPORT при создании сокета. В phpdaemon это делается следующей строкой:

Факт выбора типа сокета (блокирующий/неблокирующий) задается глобальным параметром демона Daemon::$reusePort.

Потом ко мне попала инсайдерская информация, что успеха можно достичь добавив параметр priveleged в конфиг файл. И действительно, после этого при тестировании через ab (Apache Benchmark) в консоле появилась надпись (Spawn 10 workers).

 

Вот пример рабочего конфига для phpDaemon :

Leave a Comment