Обновлять окно чата при получении нового сообщения

Я новичок в PHP. Я собираюсь создать простое веб-приложение, используя PHP, окно чата.

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

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

Есть ли способ обновить окно чата сервером при получении нового сообщения?


person Ramesh-X    schedule 14.09.2015    source источник
comment
Пример кода очень поможет. Потребуется наличие флага, который могут видеть оба клиента, поэтому, возможно, затронут элемент или файл БД. Тогда используйте AJAX. Когда сообщение вводится и отправляется, флаг устанавливается в TRUE. Другой клиент может просто продолжать проверять этот флаг (возможно, также с помощью AJAX). Как только он замечает, что он перевернут на TRUE, он может собирать и отображать сообщение, снова устанавливая флаг на FALSE.   -  person Twisty    schedule 14.09.2015
comment
На ум приходят веб-сокеты, но лично у меня нет опыта работы с ними, поэтому я не смогу помочь   -  person Adi Bradfield    schedule 14.09.2015


Ответы (2)


Стандартный порядок связи в веб-приложениях заключается в том, что HTTP-запросы инициируются веб-клиентом (браузером), а затем на них отвечает сервер.

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

Это называется принудительной отправкой на сервер. Связанная статья в Википедии перечисляет множество обходных путей.

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

Несмотря на большой шрифт, используемый другим пользователем emsch, WebSockets не подходят для всех (пока), поскольку не все браузеры его поддерживают. Сравните ваш браузер / матрицу ОС, например. с реализацией браузера.

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

Если вы новичок в веб-разработке и разработке сетей, я бы посоветовал поискать хорошую библиотеку обмена сообщениями.

  • Если вам необходимо поддерживать старые браузеры, воспользуйтесь библиотекой, которая поддерживает несколько из упомянутых методов и возвращается к наиболее подходящему случаю.
  • Если вы можете использовать современные браузеры, попробуйте библиотеку на основе WebSockets.
person mvw    schedule 14.09.2015

Да, есть способ уведомить клиента сервером. Это называется

WebSocket.

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

Раньше я не использовал его в php, но быстрый поиск в Google дал мне некоторые результаты библиотек, так что вы должны найти правильное решение. Хотя я думаю, что сервер node.js на каком-то другом сервере, работающем в непрерывном режиме, лучше подходит для этой функции.

Затем на стороне клиента вы можете общаться через WebSocket в JavaScript.
Сначала откройте соединение

var webSocket = new WebSocket("ws://www.example.com/socketserver");

Затем вы можете дождаться входящего трафика и обработать данные в функции

webSocket.onmessage = function (event) {
    console.log(event.data);
}

Это всего лишь очень краткий обзор. Вы найдете много информации по этой теме, например, в Сеть разработчиков Mozilla

person schnaidar    schedule 14.09.2015