Я разрабатываю чат-приложение на PHP. Я использую nginx в среде php-fpm. Проблема в том, что после подключения нескольких клиентов скрипты PHP становятся очень медленными.
У меня подключено всего несколько (5-10) клиентов, а длительный опрос установлен на 30 секунд. Nginx мгновенно обслуживает статический контент, такой как изображения или стили, но для скриптов PHP загрузка занимает почти 5 секунд. Я использовал XDebug для профилирования кода, но он говорит мне, что тот скрипт, который загружался за 5 секунд, занял всего 100 мс, что сбивает с толку.
Я думаю, что php5-fpm ставит в очередь входящие запросы, что вызывает такие задержки. Что я должен знать о конфигурации php5-fpm при использовании длинного опроса? Хочу подчеркнуть, что когда ~ 5 клиентов используют чат, он становится очень и очень медленным.
Аналогичная проблема: http://forum.nginx.org/read.php?3,198958 (один долго работающий PHP-скрипт блокирует все остальные PHP-запросы)
Это также может быть связано: http://www.matt-knight.co.uk/2011/concurrent-php-sessions/
Возможно, в вашей конфигурации PHP-FPM не хватает рабочих. Обычно я следую этому правилу при настройке конфигурации php-fpm, выбираю динамичный конфигурация pm вместо статический:
pm = dynamic
pm.max_spare_servers = total cpu cores
pm.start_servers = (0.25 * total cpu cores)
pm.min_spare_servers = (0.5 * total cpu copres)
pm.max_children = 64
Выше pm.max_children
это число потребляет больше оперативной памяти, но тем больше одновременных подключений вы можете обработать. Если у вас мало оперативной памяти, вам следует подумать о lowring pm.max_chidren и переключиться на динамическую pm вместо статической.
Если вы выберете установить личку в по запросу, по требованию режим, а не un динамичный, чтобы ваш долгий опрос работал правильно, убедитесь, что это значение достаточно высокое: pm.process_idle_timeout = 45s;
Обычно я оставляю значение по умолчанию 10 секунд, но вы можете попробовать 30 секунд, если у вас окно опроса 30 секунд.
Для получения дополнительной информации о настройке PHP-FPM: вы можете ознакомиться с официальной документацией по этому адресу: http://php.net/manual/en/install.fpm.configuration.php
Создание приложения в реальном времени на голом php - не очень хороший вариант, особенно когда вам нужен длительный опрос. Вы можете сделать некоторые настройки, но рано или поздно (например, при 150 подключенных клиентах) вам придется изменить свою архитектуру.
Также длительный опрос требует постоянного доступа к базе данных, чтобы узнать, когда было отправлено новое сообщение для пользователя. Это может быть излишним, когда у вас более 5-10 пользователей, и это, вероятно, причина того, что после 5-10 клиентов ваш сервер начинает работать медленнее.
Я предлагаю вам использовать отдельный сервер nodejs с socket.io для приложения реального времени, он отлично работает и может без проблем обрабатывать тысячи одновременных подключений. Он содержит отличные параметры конфигурации, а также поддерживает веб-сокеты или длительный опрос в зависимости от возможностей подключенного клиента.
Вы можете посмотреть на socket.io
Кроме того, чтобы отправлять сообщения (push-контент) с php на сервер node.js на сервер node.js, вы можете использовать elephant.io библиотека