2016-07-14 1 views
-2

Я делаю сайт, который будет иметь разные чаты. Любой пользователь может создать чат в любое время, а другой пользователь может присоединиться к чату, когда он будет доступен. Максимально два пользователя могут одновременно общаться в одном чате, но могут существовать несколько чатов.Установите, действительно ли в данный момент пользователь онлайн, а в противном случае чат (php)

Я использую AngularJS и PHP с API PubNub для работы в чате. Созданный чат будет храниться в базе данных MySQL со следующими полями:

  • User1: пользователь, создавший комнату для обсуждения. Он может измениться или быть null, если он уходит.
  • User2: он будет null на первом месте и сохранит имя пользователя, который присоединится к чату.
  • Закрыто: когда оба пользователя находятся в автономном режиме, это будет правда (1), и никто больше не сможет присоединиться.

Я должен обновить столбцы «user1» или «user2», когда кто-либо из пользователей покинет чат. Затем проверьте, находятся ли оба пользователя в автономном режиме, а затем обновите закрытое значение.

Я знаю, что могу сохранить последнее соединение пользователя, вызвав функцию PHP через AJAX каждые 60 секунд, например. Даже я мог проверить, остается ли другой пользователь в режиме онлайн, проверяя его последнее соединение в той же функции, но кто будет вызывать функцию, чтобы проверить, остался ли последний пользователь?

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

Я предполагаю, что я могу установить функцию тайм-аута в PHP каждый раз, когда пользователь присоединяется/создает чат. Эта функция собирается обновить столбец пользователя до null и обновить закрытое значение, если оба значения: null. Когда пользователь находится в чате, каждые 60 секунд будет вызываться другая функция, чтобы отложить первый. Но я не знаю, если это возможно, и если это возможно, используя общий хостинг.

Надеюсь, вы можете мне помочь и поблагодарить вас за внимание.

+1

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

+1

Согласитесь с Кевином о веб-сайтах ... если ваш сервер не написан на php (а не apache, но сам php прослушивает некоторые порты). Я предлагаю вам использовать что-то вроде node.js для сообщений чата на стороне сервера. – SparK

ответ

1

PubNub Наличие: в реальном времени против опроса

Ответ - не опрос на предмет наличия, вместо этого, есть сервер слушать изменения в присутствии канала с использованием PubNub Presence Web Hooks. Пожалуйста, внимательно прочитайте эту статью, так как она описывает все аспекты веб-крючков присутствия PubNub, а затем просматривает official documentation for PubNub Presence Web Hooks. Пример кода для реализации конечной точки REST на вашем сервере для получения веб-крючков - это Node, но вы можете использовать этот код для реализации этого на PHP, если это необходимо, но если вы можете использовать Node для этой цели, это может быть лучший выбор (и вы все еще может использовать PHP для всего остального).

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

Когда user2 выписывает user1 'чаты канал с, PubNub пошлет присоединиться события к вашему серверу через веб-крюк и ваш сервер может использовать это событие, чтобы обновить базу данных с user2-х Информация.

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

После того, как последний пользователь листьев чат комната, PubNub пошлет канал неактивного события на сервер, и сервер может вызвать его чата закрыт процесса обновления базы данных по мере необходимости.

Это довольно высокий уровень дизайна, и есть некоторые другие детали, которые следует учитывать, но сообщение здесь не опрос PubNub для информации о наличии. Используйте только hereNow, чтобы получить текущее состояние присутствия канала и прослушать дальнейшие события присутствия с этой точки вперед либо через веб-крючки на ваш сервер, либо через присутствие/подписку на приложения для ваших клиентов. В реализации вы фактически подписываетесь с присутствием (слушайте события присутствия), а затем вызываете hereNow.

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

+0

Собственно, это тот ответ, который я ожидал. –

+1

Я реализовал функцию чата с помощью учебника angularjs на веб-сайте PubNub. Я читал о событиях присоединения и отпуска (слушал на стороне клиента), но ничего не знал о веб-крючках. Похоже, это трюк. Большое спасибо. –

Смежные вопросы