Daniels93
@Daniels93
PHP/JS Фронт-енд недохипстер

Самый простой способ реализовать real time MySQL (без firebase!) базу данных для маленького приложения?

Продолжаю делать дальше своё приложение, но не могу определится с базой данных:
php/mysql - знаю но это не real time. Мне важно чтобы данные обновлялись в реальном времени.

node.js - знаю что там можно осуществить real time базу данных, но я плохо знаю node.js. Боюсь, что простой CRUD я бы накопал в интернете, но чтобы я потом из этого мог "лепить" моё приложения, со всеми последующими подсчетами в базе данных и т.д... Скорее нет.

Из других вариантов остаётся ajax? Сделал один пример, работает, но только в моём браузере. То есть все операции CRUD обновляются в браузере без перезагрузки, но само ссобой только в моём. Ajax скорее всего хорошо подходит, чтобы база данных обновлялась в моём браузере без перезагрузки страницы, а мне важно чтобы данные обновлялись в реальном времени на браузере другого компьютера.

Socket.io? Есть ли другие варианты? Какие бы вы технологии выбрали чтобы решить проблему простым путём без изобретения ядерной ракеты на node.js и без Firebase.

Спасибо
Daniels
  • Вопрос задан
  • 1185 просмотров
Решения вопроса 1
@xfg
Базу данных можно выбрать любую. Она не играет роли в realtime приложениях. Позвольте вам немного объяснить. Для передачи данных между клиентом и сервером в браузере существует всего два протокола. HTTP и Websocket. Firebase не магия и также использует их. Если браузером не поддерживается Websocket, то firebase откатывается на HTTP. Используя общераспространенный подход к разработке на PHP у вас не получится использовать websocket протокол поскольку типичные PHP приложения не живут дольше 1 запроса. Соответственно да, в таком варианте остается только ajax. Но точно также работает и firebase если в браузере нет поддержки websocket, так работает facebook, telegram и много всего остального. Они используют long-polling. Клиент отправляет запрос к скрипту на сервер, скрипт в цикле опрашивает хранилище mysql или более продвинутый вариант mysql+redis (чтобы не грузить запросами mysql) и пока данных не будет, цикл так и продолжит крутиться, для клиента это просто выглядит как повисший запрос к серверу. Как только данные появляются, они отправляются на клиент, соединение разрывается, а клиент сразу же отправляет новый запрос.

Есть развитие этой идеи. Называется HTTP Streaming. Отличие от long-polling в том, что после отправки данных клиенту соединение не разрывается, а сервер продолжает отправлять последующие данные по этому же соединению. Соединение разрывается по таймауту. Минус в том, что прокси-сервера могут кешировать небольшие пакеты данных и данные нужно раздувать например пробелами, чтобы пакет данных достигал минимального размера и был способен пробить кеш прокси-сервера. Плюс в том, что если у вас данные для клиента появляются скажем с переодичностью раз в секунду, то не будет происходить постоянного открытия-закрытия соединения как при long-polling.

Есть вариант, когда можно реализовать небольшую прослойку на socket.io. Ваше PHP приложение пишет данные для клиента например в redis. Приложение на socket.io подписывается на redis. Когда PHP что-то отправляет в redis, то socket.io мгновенно об этом узнает и рассылает это событие по websocket протоколу всем подключенным клиентам. Минусы. Раздуваете стек. Нет консистентности данных между записью в основное хранилище (mysql/postgre/mongo/etc) и redis. Соответственно может возникнуть ситуация, когда данные записали, но в redis событие не ушло. Поменяете местами, будет наоборот, событие есть, данных в базе нет.

Вариантов в целом очень много. Всё это называется Comet. Вам проще всего реализовать long-polling.

А реал-тайм база, которая умела пушить данные клиенту по tcp протоколу (но не в браузер) была и называлась она rethinkdb.com. Ныне не развивается. IP в России заблокирован. На сайт можно сходить по VPN.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@geekfil
Я не эксперт конечно, но знаю замену Firebase - loopback.io, аналогов ему не встречал.
Ответ написан
profesor08
@profesor08
Первый вариант, поднимаешь любыми средствами вебсокет сервер, и тем самым получаешь что желаешь в полной мере, если использовать популярные библиотеки, то получишь встроенный фолбек на второй вариант. Второй, с некоторыми интервалом, или раз за разом отправляешь из браузера запрос на сервер, для получения новых данных. Если на бэке только пхп, то остается второй вариант, но можно заюзать библиотеку из первого, которая сама определит, что там на сервере, таким образом получишь закладку на будущее, если вдруг поднимешь вебсокет сервер, то клиент дописывать не придется.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
Panda Media Нижний Новгород
от 35 000 руб.
Ремарк Тюмень
от 30 000 руб.
13 нояб. 2019, в 17:51
40000 руб./за проект
13 нояб. 2019, в 17:34
1500 руб./за проект
13 нояб. 2019, в 17:27
200 руб./за проект