Особенности Workerman

1. Чистая разработка на PHP

Приложения, разработанные с помощью Workerman, могут работать независимо от контейнеров таких как php-fpm, apache, nginx. Это делает разработку, развертывание и отладку приложений для PHP-разработчиков очень удобными.

2. Поддержка многопроцессного PHP

Для полного использования производительности многопроцессорных серверов Workerman по умолчанию поддерживает многопроцессные задачи. Workerman запускает один главный процесс и несколько дочерних процессов для предоставления услуг. Главный процесс отвечает за мониторинг дочерних процессов, а дочерние процессы сами слушают сетевые соединения и обрабатывают получаемые данные. Благодаря простой модели процессов Workerman становится более стабильным и эффективным.

3. Поддержка TCP и UDP

Workerman поддерживает два протокола транспортного уровня: TCP и UDP. Для смены протокола достаточно изменить одно свойство, а код бизнес-логики не требует изменений.

4. Поддержка долгосрочных соединений

В ряде случаев приложения на PHP должны поддерживать долгосрочные соединения с клиентами, например, в чатах, играх и прочих. Однако традиционные PHP-контейнеры (apache, nginx, php-fpm) зачастую с этим справляются с трудом. С использованием Workerman, пока серверная бизнес-логика не вызывает интерфейс для закрытия соединения, можно использовать долгосрочные соединения на PHP. Один процесс Workerman может поддерживать тысячи активных соединений, а многопроцессная модель позволяет поддерживать десятки или даже сотни тысяч параллельных соединений.

5. Поддержка различных протоколов прикладного уровня

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

6. Поддержка высокой нагрузки

Workerman поддерживает библиотеку событий Libevent (необходимо установить расширение event), использование Event при высоких нагрузках с долгосрочными соединениями демонстрирует очень высокую производительность. Если расширение Event не установлено, используется встроенный в PHP системный вызов Select, и производительность также остается очень высокой.

7. Поддержка плавной перезагрузки сервиса

При необходимости перезагрузить сервис (например, при выпуске новой версии) мы не хотим, чтобы процессы, обработка пользовательских запросов которых продолжается, были немедленно прекращены, и тем более, чтобы в момент перезагрузки происходили сбои в коммуникации с клиентами. Workerman предоставляет функционал плавной перезагрузки, который обеспечивает обновление сервиса без влияния на пользователей.

8. Поддержка обнаружения обновления файлов и автоматической загрузки

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

9. Поддержка запуска дочерних процессов от указанного пользователя

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

10. Поддержка постоянного хранения объектов или ресурсов

В процессе работы Workerman загружает и анализирует PHP-файлы только один раз, а затем держит их в памяти, что означает, что декларации классов и функций, среда выполнения PHP, таблицы символов и т. д. не создаются и не уничтожаются повторно. Это принципиально отличается от механизма выполнения PHP в контейнерах веб-приложений. В Workerman статические члены или глобальные переменные в пределах жизненного цикла процесса остаются постоянными, если их явно не уничтожить, что означает, что ресурсы, такие как объекты или соединения, могут быть размещены в глобальных переменных или статических членах классов и повторно использованы для всех запросов в течение жизненного цикла текущего процесса. Например, если соединение с базой данных инициализируется один раз внутри процесса, то все запросы этого процесса могут повторно использовать это соединение, избегая трехсторонней рукопожатия TCP, верификации прав доступа к базе данных и четырехсторонней рукопожатия TCP при отключении, что значительно повышает эффективность приложения.

11. Высокая производительность

Поскольку PHP-файлы читаются и анализируются с диска только один раз и затем сохраняются в памяти, повторные обращения используют уже существующий opcode в памяти. Это значительно снижает операции ввода-вывода с диском, а также время, затрачиваемое на инициализацию запросов, создание среды выполнения, лексический и синтаксический анализ, компиляцию opcode, закрытие запросов и множество других трудоемких процессов. Кроме того, поскольку Workerman не зависит от контейнеров, таких как nginx или apache, затраты на взаимодействие между этими контейнерами и PHP значительно снижаются. Наиболее важным является то, что ресурсы могут оставаться постоянными, без необходимости при каждом запросе инициализировать соединения с базой данных и т. д., что делает производительность приложений на Workerman очень высокой.

12. Поддержка HHVM

Поддерживает работу на виртуальной машине HHVM, что может многократно улучшить производительность PHP. Особенно это заметно в вычислительно интенсивных задачах, где производительность оказывается очень высокой. По результатам фактических нагрузочных тестов, Workerman, работающий под HHVM, показывает на 30-80% большую пропускную способность по сравнению с запуском на Zend PHP5.6 без нагрузки.

13. Поддержка распределенного развертывания

14. Поддержка работы в режиме демона

15. Поддержка прослушивания нескольких портов

16. Поддержка перенаправления стандартного ввода и вывода