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

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

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

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

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

2 ответа

Решение

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам