Как сделать оповещение на сайте с помощью php + mysql + ajax для большого количества пользователей?
Всем доброго времени суток и с наступающим) Суть вопроса такова:
Наверное как и все начинающие изучение php mysql ajax хотят сделать велосипед, чтобы разобраться как это все работает от и до.
Хочу сделать мгновенное оповещение
- на сайте сидит более 500 человек онлайн
- появляются новые данные в базе
- появляется мгновенное сообщение о новой записи
Вроде задача не сложная, но есть НО.
на сайте делается запрос аля comet, ожидает ответа, если ответа нет,
то через 2 минуты делает новый запрос, и все до тех пор, пока цикл php не выдаст ответ
Сделал на php обработчик, который проверяет новые записи while
в цикле делается проверка на новые сообщения с интервалом 1 секунда
как только появляется новая запись например со статусом new, сразу отдается ответ, и снова запускается цикл
открывал 5 окон браузера, вроде все работает быстро и без проблем, но как только открываю более 6 окон, начинает все виснуть, хром в статусе пишет, что ищет свободный сокет, может проблема в хроме, но если в этот момент открыть сайт с другого компьютера, то страница и там висит.
Я так понимаю, что запускается более 6 циклов и сервер не справляется (мониторить ресурсы сервера нет возможности, ибо хостинг reg ru)
Прошу помощи поделиться опытом, какая математика должна быть.
Не знаю как и в чем найти причину
- либо ресурсы сервера не позволяют выполнять много циклов одновременно
- либо кол-во соединений ограничено сервером
- либо циклы должны работать как то параллельно
Знаю , что есть soket.io node.js и тому подобное, но они мне не даются
Включил веб-сокет сервер на определенный порт, использовал ratchet.
Когда на стороне сервера происходит нужное событие, например создание сущности, сокет сервер уведомляется об этом и рассылает уведомления пользователю/пользователям.
Сами уведомления у меня были 3-х видов, но вам нужно только одно: вида {model: "notify", data: {title: "text", body: "text"}}.
На стороне клиента парсите и делает что-хотели.
На php сокеты работают через попу так как нет доступа одного процесса php к другому, поэтому приходится поднимать один сокет сервер который слушает пользователей, а другой который слушает другие php процессы.
А у меня просто легковесный websocket-server на Go, на нём глобальный чат в игре работает. На нагрузку не тестировал, но уж точно побольше, чем 6 клиентов одновременно потянет.
Реализация просто ужасная. но если все же нужно то стоит выучить двунаправленные протоколы. через HTTP теоретически и технически ничего хорошего получится не может.
"на сайте делается запрос аля comet, ожидает ответа, если ответа нет,
то через 2 минуты делает новый запрос, и все до тех пор, пока цикл php не выдаст ответ."
Бесполезная трата ресурсов. Если ничего не происходит вы в холостую гоняете циклы. Для справки каждый процесс пхп минимум требует около мегабайта. оперативной памяти (а зачастую больше) Умножте на количество клиентов и вы поймете что отдавать (на вскидку могу сказать что тут будет примерно по 1,4 мб в среднем) около 700 мегабайт оперативной памяти на холостую обработку слишком жирно.
теперь представим что мы отказались от циклов на сервере давайте запустим цикл на клиенте? А че? просто на джава скрипте каждые 5 секунд отправляем запрос на сервер скрипт обработчик делает запрос на табличку просто на наличие записей с галочкой new. обрабатывается запрос не долго в считаные милисекунды да еще и все-го лишь каждые 5 секунд лепота... Но клиент сволочь! он вздумал средней кнопкой мыши вкладки открывать! Да еще и по 10 штук! да еще и откроет и не закроет и пойдет свою сантабарбару смотреть! Нативный ДДОС самого себя по другому.
Как бы вы не пытались найти решение. Но самый грамотный и правильный ответ на ваш вопрос - На связке "ajax + mysql + php" реализовать данный функционал технически не возможно ввиду устройства протокола HTTP.