Как сделать оповещение на сайте с помощью php + mysql + ajax для большого количества пользователей?

Всем доброго времени суток и с наступающим)
Суть вопроса такова:
Наверное как и все начинающие изучение php mysql ajax хотят сделать велосипед, чтобы разобраться как это все работает от и до.
Хочу сделать мгновенное оповещение
- на сайте сидит более 500 человек онлайн
- появляются новые данные в базе
- появляется мгновенное сообщение о новой записи
Вроде задача не сложная, но есть НО.

на сайте делается запрос аля comet, ожидает ответа, если ответа нет,
то через 2 минуты делает новый запрос, и все до тех пор, пока цикл php не выдаст ответ

Сделал на php обработчик, который проверяет новые записи while
в цикле делается проверка на новые сообщения с интервалом 1 секунда
как только появляется новая запись например со статусом new, сразу отдается ответ, и снова запускается цикл

открывал 5 окон браузера, вроде все работает быстро и без проблем, но как только открываю более 6 окон, начинает все виснуть, хром в статусе пишет, что ищет свободный сокет, может проблема в хроме, но если в этот момент открыть сайт с другого компьютера, то страница и там висит.

Я так понимаю, что запускается более 6 циклов и сервер не справляется (мониторить ресурсы сервера нет возможности, ибо хостинг reg ru)

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

Знаю , что есть soket.io node.js и тому подобное, но они мне не даются

Хочется сделать это на ajax + mysql + php
  • Вопрос задан
  • 7534 просмотра
Пригласить эксперта
Ответы на вопрос 6
@theaidem
Server-Sent Events проще повешать, не надо там всякие "лазает на сервер каждые n секунд"
Ответ написан
Kaer_Morchen
@Kaer_Morchen
Разрабатываю web-приложения.
Я делал так.

Включил веб-сокет сервер на определенный порт, использовал ratchet.
Когда на стороне сервера происходит нужное событие, например создание сущности, сокет сервер уведомляется об этом и рассылает уведомления пользователю/пользователям.

Сами уведомления у меня были 3-х видов, но вам нужно только одно: вида {model: "notify", data: {title: "text", body: "text"}}.

На стороне клиента парсите и делает что-хотели.

На php сокеты работают через попу так как нет доступа одного процесса php к другому, поэтому приходится поднимать один сокет сервер который слушает пользователей, а другой который слушает другие php процессы.
Ответ написан
socengel
@socengel
7 лет native php в продакшене, онлайн 20000+,
Реализация просто ужасная. но если все же нужно то стоит выучить двунаправленные протоколы. через HTTP теоретически и технически ничего хорошего получится не может.

"на сайте делается запрос аля comet, ожидает ответа, если ответа нет,
то через 2 минуты делает новый запрос, и все до тех пор, пока цикл php не выдаст ответ."

Бесполезная трата ресурсов. Если ничего не происходит вы в холостую гоняете циклы. Для справки каждый процесс пхп минимум требует около мегабайта. оперативной памяти (а зачастую больше) Умножте на количество клиентов и вы поймете что отдавать (на вскидку могу сказать что тут будет примерно по 1,4 мб в среднем) около 700 мегабайт оперативной памяти на холостую обработку слишком жирно.

теперь представим что мы отказались от циклов на сервере давайте запустим цикл на клиенте? А че? просто на джава скрипте каждые 5 секунд отправляем запрос на сервер скрипт обработчик делает запрос на табличку просто на наличие записей с галочкой new. обрабатывается запрос не долго в считаные милисекунды да еще и все-го лишь каждые 5 секунд лепота... Но клиент сволочь! он вздумал средней кнопкой мыши вкладки открывать! Да еще и по 10 штук! да еще и откроет и не закроет и пойдет свою сантабарбару смотреть! Нативный ДДОС самого себя по другому.

Как бы вы не пытались найти решение. Но самый грамотный и правильный ответ на ваш вопрос - На связке "ajax + mysql + php" реализовать данный функционал технически не возможно ввиду устройства протокола HTTP.
Ответ написан
Можно через Comet сервер. Не нашел этого варианта выше. И есть пример реализации оповещений на сайте
Ответ написан
OnYourLips
@OnYourLips
Надо на всех клиентов сделать один процесс, который и будет проверять новые сообщения(и удобнее очередьми, а не в базу лезть). Этот процесс должен слушать порт, клиенты цепляются к нему.
Ответ написан
@Levhav
Возьмусь за разработку проектов любой сложности.
Вот аналогичная проблема Long Polling тормозит браузер — как это исправить? только с решением.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы