Как я могу написать чат в реальном времени, используя XAJAX и PHP?

StackOverflow https://stackoverflow.com/questions/965890

  •  12-09-2019
  •  | 
  •  

Вопрос

Как я могу написать чат в реальном времени, используя XAJAX и PHP?

Другими словами, есть ли способ отправлять ответы xajax с сервера нескольким клиентам?Или это единственная возможность проверять наличие новых сообщений каждые несколько секунд на стороне клиента?

Это было полезно?

Решение

Нет.Клиенты должны неоднократно «опрашивать» сервер.

Я думаю, что ключевым моментом здесь является продуманный дизайн взаимодействия.Хитрость заключается в том, чтобы обмануть пользователя, заставив его думать, что чат мгновенный, но на самом деле он обновляется каждые 1, 2, 3 или 10 секунд.

Идеи:

1) Когда пользователь отправляет сообщение, покажите его прямо в чате и инициируйте опрос.

2) Если опрос возвращается с несколькими сообщениями от других пользователей, не добавляйте их все сразу, добавляйте их в течение 1-2 секунд или около того, со случайным интервалом, чтобы выглядело так, будто они приходят. «мгновенно» и самостоятельно.(Если приходит сразу несколько сообщений, пользователь очень быстро понимает, что чат обновляется тут же, а не постоянно.)

3) Если пользователь бездействует в течение x времени.Уменьшите частоту опроса до одного раза в 10 секунд или около того.

4) Если пользователь активен, т.е. отправляет много сообщений, опрашивайте чаще.

5) Создайте статический файл для каждого канала, в котором вы запишите время последнего обновления чата.Например файл chat-teenfun-lastupdate.txt есть содержимое 1224934239 или любой другой формат времени, который вы предпочитаете.Обслуживайте этот файл статически и позволяйте клиентам опрашивать этот файл, чтобы проверить, обновился ли канал, вместо вызова chat-poll.php?ch=teenfun это выполняет динамическую проверку.Статические файлы обслуживаются примерно в 10-100 раз быстрее, в зависимости от работы, выполняемой динамическим скриптом, и они вам понадобятся, когда вы получите опрос более 250 пользователей.

Удачи и получайте удовольствие!

/0

ПС. В качестве альтернативы вы могли бы позволить клиентам выполнять ajax-вызовы к серверу и держать их «зависающими». То есть вы принимаете их запрос и делаете вид, что начинаете отправлять данные обратно, но потом просто делаете паузу.Когда что-то происходит, вы завершаете ответ соответствующими данными.Я считаю, что для того, чтобы это работало, вам нужно написать свой собственный HTTP-сервер, который делает это специально, поскольку в памяти не может находиться 250 php-процессов.Возможно, Lighttpd можно было бы как-то использовать таким образом с этим модом кэша LUA.Я не знаю.Хотя было бы интересно.Блин, надо как-нибудь попробовать :)

Другие советы

Конечно, есть, но я не думаю, что это будет очень эффективно для многих пользователей.Вы можете либо выполнить опрос, при котором каждый клиент опрашивает сервер, чтобы узнать, есть ли какие-либо новые сообщения, либо вы можете использовать техника кометы в котором сервер может отправлять новые сообщения клиентам. Ознакомьтесь с Плагин Comet для XAJAX.Как это будет реализовано с использованием XAJAX и PHP, мне непонятно, но вот как я попробую это реализовать.

Позвольте каждому клиенту подключиться к серверу (вход в систему и т. д.), затем:

  1. Для каждого сообщения, отправленного клиентом (отправителем), обновите очередь сообщений для клиента (получателя).
  2. Разрешить клиенту опрашивать сервер на наличие новых сообщений в очереди / отправлять новые сообщения через комету.
  3. Обновите графический интерфейс, если есть новые сообщения.
  4. Промыть, вспенить, повторить

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

Смотрите также:
Google Techtalk о функции чата Gmail (и проблемах масштабируемости)

Это мои 0,02 доллара

Пока не будет технологии HTTP push, вы никогда не сможете общаться в реальном времени только с помощью JavaScript.

Возможные обходные пути:

  • использовать Flash Фильм или Java Апплет для выполнения некоторой связи через сокет
  • удерживать запросы опроса на стороне сервера в течение нескольких секунд

Вы можете использовать веб-сокеты, но, поскольку это новая функция HTML5, она ограничена.К счастью для тебя, есть носкиjs, который реализует веб-сокеты в браузерах, которые их не поддерживают.

На стороне хостинга вы должны иметь возможность использовать любой сервер веб-сокетов, есть несколько для PHP.

Если вы хотите реализовать чат-сервер, написанный на языке сценариев, таком как PHP/JSP, метод зависания HTTP-соединения должен быть отмечен галочкой в ​​вашем списке опций.Причина в том, что большинству веб-серверов (особенно общих хостов) не нравится слишком много зависаний соединений.

В этом разделе вы можете найти все необходимое для реализации веб-клиента и сервера чата PHP. «Оптимизированный протокол чат-сервера для серверных языков сценариев» публикация.

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

На стороне сервера сделайте так, чтобы сценарий «зависал» на 60 секунд или до тех пор, пока не будет получено новое сообщение.При этом одно и то же соединение остается открытым максимум 60 секунд, но при получении нового сообщения оно выводит его и немедленно останавливается, предлагая AJAX на стороне клиента открыть другое соединение.

Это обеспечивает почти мгновенное уведомление о новых сообщениях, а также намного проще на сервере, чем устанавливать новое соединение каждые x секунд.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top