Мы пытаемся внедрить службу уведомлений на длинных опросах в ERP нашей компании. Подобно уведомлениям Facebook.Длинный опрос с Ajax и PHP - Apache freezes
Используемые технологии:
- РНР с
timeout
набор до 60 секунд и 1 секундаsleep
в каждой итерации цикла. - jQuery для обработки AJAX.
- Apache как веб-сервер.
После почти месяца кодирования мы пошли на производство. Через несколько минут после развертывания нам пришлось откатить все. Оказалось, что наш сервер (8 ядер) не может обрабатывать длинные запросы от 20 сотрудников, используя каждую вкладку 5 браузеров. Например: Пользователь открыл 3 вкладки с нашей ERP, с одним длинным опросом AJAX на каждой вкладке. Открытие 4-й вкладки невозможно - она зависает, пока не будет убит один из предыдущих 3 (и, следовательно, AJAX остановлен).
«Ограничения Apache», подумали мы. Итак, мы пошли гуглингом. Я нашел некоторую информацию об модулях и конфигурациях MPM Apache, поэтому я попробовал. Наш сервер использует prefork
MPM, так как apachectl -l
показал нам. Поэтому я изменил несколько строк в конфигурации, чтобы выглядеть следующим образом:
<IfModule mpm_prefork_module>
StartServers 1
MinSpareServers 16
MaxSpareServers 32
ServerLimit 50%
MaxClients 150
MaxClients 50%
MaxRequestsPerChild 0
</IfModule>
Забавно, он работает на моей локальной машине с аналогичной конфигурацией. На сервере похоже, что Apache игнорирует конфигурацию, потому что с MinSpareServers
, установленным на 16, он перезапускает 8 после перезагрузки. Вы не представляете, что делать.
Хотя это и не так, но существует [ограничение на максимальное постоянное соединение на сервер] (http://stackoverflow.com/a/985704/570812), реализованных в различных браузерах. Возможно, вам захочется проверить, будет ли на 4-й вкладке подключаться любое количество сотрудников. – Passerby
Не спать страницы, которые блокируют поток apache/php. Вам нужно будет увеличить число ваших работников Apache и т. Д. Все, что дерьмо. В моей платформе CRM я делаю это с простым текстовым файлом, просматриваемым для каждого пользователя. Временная отметка последней проверки против отметки времени теперь, если разница> 60, тогда делать опрос иначе ничего не делать. Установите скрипт для запуска каждую секунду. – Dave
Попробуйте использовать websocks для этого, над python. –