2016-07-08 5 views
1

Я хочу реализовать PHP-чат с несколькими комнатами, однако я не хочу, чтобы каждый браузер опросил сервер, вместо этого Я предпочитаю, чтобы сервер отправлял обновления всем пользователям в каждой комнате. В идеале я хотел бы иметь только экземпляр PHP работает для каждой комнаты (плюс, конечно, запросы AJAX, отправленные пользователями для обновления БД, я знаю, что на стороне сервера события широко не поддерживается):Может ли больше браузеров получать серверные события из того же экземпляра PHP-скрипта?

  • пользователей сообщений POST с использованием POST AJAX-запрос
  • , когда скрипт PHP в комнате читает БД и находит новое сообщение, он отправит обновление всем пользователям, подключенным к этой комнате, таким образом, он будет более отзывчивым и будет оказывать меньшее давление на связь БД

Так что в принципе, если есть N пользователей и K комнат, я хочу уменьшить накладные расходы от

N database/php poll requests every while 

в

K database/php poll requests every while 
+1

Я думаю, что это может быть полезно: https://github.com/walkor/phpsocket.io у него даже есть пример чата в readme – valepu

+0

спасибо, я буду считать, что, однако, я искал что-то более простое, чем сокет для кода из-за ограничений по времени, EDIT: ehy, что библиотека и Workerman приложили много усилий, они кажутся гораздо более масштабируемыми и полными, чем любая другая инфраструктура, однако это потребует когда-нибудь получить графы из этих – GameDeveloper

+0

Не думаю, что есть альтернатива, если вы хотите, чтобы ваш сервер отправлял запросы клиентам и использовал только PHP, вам понадобятся веб-узлы. Альтернативой является «длинный опрос» http://stackoverflow.com/questions/11077857/what-are-long-polling-websockets-server-sent-events-sse-and-comet – valepu

ответ

1

Да, но для этого потребуется создать собственный веб-сервер: т. Е. Сервер сокетов в PHP для получения http-запросов от клиентов. Затем вы просто держать один массив сокетов в чате, и когда вы получите сообщение, которое вы хотите вещать всем слушателям, необходимо создать и отправить сообщение SSE к каждому клиенту, что-то вроде:

data: {room:12,msg:"Hello World"}\n\n 

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

Однако, если используя, скажем, Apache + PHP, то то, что вы хотите, невозможно. Каждое SSE-соединение получит выделенный PHP-процесс. (Если это ваш единственный выбор и опрос БД очень дорог, вы можете провести один процесс опроса БД, а затем отправить сообщения в локальную БД в памяти и провести каждый опрос процесса PHP в БД в памяти.)

2

Вы могли бы лучше использовать веб-сокеты для этой цели. Если вы хотите использовать PHP, есть несколько библиотек для этого:

1) Ratchet

2) ReactPHP

3) d-Node

и другие. Я использовал Ratchet и React. Они отлично работают, так как для меня

+0

как 1), так и 2) предполагает, что я могу получить доступ к программе php для запуска сценария из SSH на удаленном компьютере.Вот почему я просил php-события вместо использования готовой библиотеки .. Спасибо в любом случае :) – GameDeveloper