Масштабируется ли php с помощью обратного длинного опроса ajax?

Я работаю над веб-сайтом, который отображает некоторые данные из БД, которые часто меняются (статус очереди и беседы в чате). Моя текущая установка - Apache / PHP / MySQL. Естественно, я бы хотел избежать опроса сервера каждые x секунд, поскольку это плохо масштабируется. Я хотел бы сделать обратный длинный опрос ajax, однако я читал, что Apache не работает с этим, поскольку у него быстро заканчиваются рабочие потоки. Есть много других веб-серверов, которые позволяют обойти эту проблему: nginx, tornado и т. Д. Однако моя проблема в том, что PHP - ЕДИНСТВЕННЫЙ серверный язык сценариев, который я знаю. Кроме того, я уже написал несколько сценариев PHP, поэтому я бы хотел их сохранить, если можно. Я согласен с переключением сервера, если я все еще могу использовать PHP.

Но после дополнительных исследований я прочитал, что люди говорят, что PHP (PHP-FPM?) Также создает процесс для каждого сделанного запроса, что означает, что если у меня есть сотни / тысячи открытых подключений, будут сотни / тысячи процессов. , что тоже будет проблемой.

Могу ли я сделать вывод, что не существует хороших масштабируемых способов создания веб-сайтов с длинными опросами с использованием PHP? Следует ли мне отказаться от PHP и изучить другой язык сценариев сервера? Я могу продолжить разработку длинных опросов, используя мою текущую настройку (Apache / PHP), но я не хочу, чтобы выбор языка сценариев ставил какие-либо ограничения на масштабируемость моей системы при развертывании. И что я должен делать? Я не очень разбираюсь в веб-программировании, поэтому, если какой-либо гуру может дать мне несколько советов, я был бы признателен! Спасибо!


person pinghsien422    schedule 11.11.2011    source источник
comment
Сам не делал этого, но можно ли использовать сокеты js? возможно, используя node.js. Встроенная поддержка веб-сокетов в браузерах поддерживается, но я предполагаю, что плагин jquery обрабатывает это?   -  person Ian Wood    schedule 11.11.2011
comment
Я не особо рассматриваю websocket, поскольку он не поддерживается всеми основными браузерами. На самом деле я изучал node.js, но, насколько я слышал, он все еще относительно новый, поэтому поддержка фреймворка более ограничена. В настоящее время я рассматриваю Django, а это значит, что мне нужно заняться питоном. Я слышал хорошие отзывы о фреймворке, но я бы все же предпочел остаться с php, если есть способ обойти падение производительности.   -  person pinghsien422    schedule 14.11.2011
comment
Я бы определенно пересмотрел node.js - простой запрос ajax к порту сервера, на котором работает node.js, может быть уловкой.   -  person Ian Wood    schedule 15.11.2011


Ответы (2)


PHP, запущенный в режиме php-fpm, по-прежнему будет иметь ограничения, особенно если ваш код потребляет много памяти. Вы не сможете запускать тысячи параллельных процессов без некоторой доступной памяти. Но обычно он выполняется быстрее, чем mod_php, и по крайней мере HTTP-запросы, для которых не нужен PHP, обрабатываются веб-сервером, и если этот веб-сервер - nginx, вы получите гораздо больше HTTP-запросов, доступных параллельно.

С php-fpm у вас также будет очередь ожидающих запросов, которая может быть полезна в случае временного большого трафика, поскольку, по крайней мере, запросы ставятся в очередь, а не отклоняются.

Теперь длинные операции опроса подходят для nginx (или других, например), но не для PHP. PHP не предназначен для длительного использования, каждый запрос - это новый процесс, и это действительно неправильный выбор для KeepAlive. Но «Divide ut regnes» (разделяй и властвуй). Ваши длительные задачи опроса могут выполняться рядом с вашим PHP-приложением, но без вашего PHP-приложения.

В качестве примера посмотрите на проект jappix, это проект PHP. Но вам нужно разместить где-то сервер XMPP (например, ejabberd) и сервер BOSH с nginx в качестве прокси на порту 80 для этого сервера BOSH (так что у вас есть протокол чата xmpp на порту 80, через nginx и ejabberd, и ничего на сторона PHP для этого). Тогда проблема состоит в том, чтобы подключить аутентификацию, идентификацию и т. Д. Вашего приложения, и это нужно будет сделать, расширив конфигурацию сервера XMPP (чтобы он использовал тот же сервер LDAP, что и ваше приложение PHP, например).

Вторая проблема с длительным опросом - это статус очереди. Возможно, вы найдете для этого несколько расширений XMPP. Или вы можете выполнять обычные запросы ajax в очереди. Один из полезных способов избежать большого количества запросов ajax в вашем приложении PHP - это перенести следующую проверку ajax на обратный вызов проверки ajax на основе чисел Фибоначчи (это пример). Таким образом, в первый раз следующий вызов ajax будет запланирован через 1 минуту, в следующий раз через 2 минуты, затем 3, 5, 8, 13, 21, 34, 55, 89, 144 и т. Д. Идея в том, что, возможно, важно проверить поступление новых сообщений через 1 минуту после загрузки страницы. Поскольку пользователь все еще читает ту же страницу (или пьет кофе, разговаривает с другом, уезжает в отпуск, не выключая компьютер и т. Д.), Мы можем все больше и больше откладывать следующие проверки. Это способ предположить, что пользователь на самом деле не активен. Обратите внимание, что вы можете обнаружить активность пользователя другими способами и изменить расписание.

person regilero    schedule 19.02.2012

PHP не подходит для длинных опросов, технологий Comet и обратного ajax. Вы должны использовать Node.js

person Imran Akram    schedule 20.05.2013
comment
Пожалуйста, укажите причины вместо ответа в одну строку. - person pascalhein; 20.05.2013