Как я могу написать чат в реальном времени, используя XAJAX и PHP? - PullRequest
7 голосов
/ 08 июня 2009

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

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

Ответы [ 6 ]

8 голосов
/ 08 июня 2009

Нет. Клиенты должны "опросить" сервер повторно.

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

Идеи:

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

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

3) Если пользователь простаивает в течение х времени. Снижайте частоту опроса каждые 10 секунд или около того.

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

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

Удачи и веселья!

/ 0

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

6 голосов
/ 08 июня 2009

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

Пусть каждый клиент подключится к серверу (логин и т. Д.), Затем:

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

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

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

Это мои $ 0,02

1 голос
/ 12 июля 2012

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

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

1 голос
/ 08 ноября 2011

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

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

1 голос
/ 08 июня 2009

Пока там нет технологии HTTP push, вы никогда не получите чат в реальном времени только с использованием JavaScript.

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

  • используйте Flash фильм или Java апплет для выполнения некоторой связи через сокет
  • удерживать запросы на сервере на несколько секунд
0 голосов
/ 26 октября 2009

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

На стороне сервера сделайте сценарий "остановленным" на 60 секунд или до получения нового сообщения. Это позволяет одному и тому же соединению оставаться открытым не более 60 секунд, но при получении нового сообщения оно выводится и немедленно останавливается, предлагая клиентскому AJAX открыть другое соединение.

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

...