@zheka_9l
Front and Back G-coder

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

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

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

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

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

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

Заранее благодарен.
  • Вопрос задан
  • 114 просмотров
Пригласить эксперта
Ответы на вопрос 3
inoise
@inoise
Solution Architect
Вебсокеты может лучше прикрутите?
Ответ написан
@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 любят за то что асинхронных подход там используется изначально
Ответ написан
Ваш ответ на вопрос

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

Войти через TM ID
Похожие вопросы
22 янв. 2019, в 00:48
60 руб./за 1000 зн.
22 янв. 2019, в 00:09
120000 руб./в месяц
21 янв. 2019, в 23:37
1000 руб./за проект