@zheka_9l
Full stack

Мнгновенные оповещения ajax Long Polling && php?

Доброго времени суток.

Меня интересует такой вопрос...
Как реализовать серверную часть проверки бд, на новые оповещения для пользователя?

Гуглил, ничего подобного не нашел, лишь один пример, с проверкой на дату изменения файла.

Сокеты мне не подходят, пользуюсь простым хостингом для тестов, да и я новичок пока что, мало чего знаю.
Поэтому сокеты для меня будут проблематичными.

Кому не сложно, если есть пример, скиньте пожалуйста, уж очень нужно.

Заранее благодарен.
  • Вопрос задан
  • 234 просмотра
Пригласить эксперта
Ответы на вопрос 3
inoise
@inoise Куратор тега PHP
Solution Architect, AWS Certified, Serverless
Вебсокеты может лучше прикрутите?
Ответ написан
@grinat
Лонг пул тебе тоже не подойдет, у тебя скрипт будет убиваться через 60 секунд. А там и там нужно чтобы скрипт постоянно работал. Советую обратить внимание на heroku, там по манам можешь поднять сокеты nodejs, а затем постоянно дергать данные через rest со своего сервера. Ну то ест на хероку у тебя тупо прокся будет, которая все данные будут поулчать/перенаправлять твоему серверу на php.
Ответ написан
@rPman
Как реализовать серверную часть проверки бд, на новые оповещения для пользователя?
не все базы данных предоставляют такой функционал, например postgres позволяет, используя sql выражения LISTEN и NOTIFY, и соответствующий метод на клиенте pg:
php.net/manual/ru/function.pg-get-notify.php

К сожалению php не event oriented язык програмирования (только сокеты позволяют красиво все делать асинхронно), то либо вы вызываете pgsqlGetNotify с 1 или 0.1 секундным интервалом в цикле, проверяя наличие notify либо слушаете свой сокет асинхронно в своем приложении, а в соседнем в цикле с 10-30 секундным ожиданием ждете событие и отправляете ответ в этот сокет.

если база данных не умеет listen или аналоги, у вас только один путь - опрашивать эту базу периодическими запросами в цикле (советую опрашивать специальную таблицу, в которую вы будете триггерами или еще как записывать необходимые события, иначе нагрузите базу по самое немогу)
----------

чтобы отправить ответ на сторону веб-клиента, вы вынуждены будете либо использовать long pooling (устаревшая технология, с кучей проблем) либо посмотреть примеры по работе с websocket и научиться наконец красивому event-based программированию, посмотрите примеры сервера websocket на php (на стороне клиента все еще проще)
socketo.me/docs/hello-world
В этом случае ваше php приложение становится полноценным веб-сервером (вебсокет например), который все еще не рекомендуют выпускать в интернет напрямую, и устанавливают между интернетом и им классивческий ngnix или apache.

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

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

p.s. nodejs любят за то что асинхронных подход там используется изначально
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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