PHP Джаббер:если я войду в систему, проверю сообщения и отключусь, на стороне других пользователей я буду отображаться как отключенный
Вопрос
Я не уверен, что то, что я делаю, абсолютно правильно.Но вот:
- Пользователь входит в чат через веб-интерфейс
- Пользователь информируется об обновлениях через Comet
- Пользователь вводит данные, которые переходят в файл PHP, который далее подключается к серверу Jabber.
Теперь проблема в том, что когда пользователь хочет отправить сообщение, это просто: запустить php, с помощью которого я подключаюсь к серверу Jabber и отправляю сообщение.Проблема возникает, когда я жду сообщения.Потому что, если я войду в систему, проверю сообщения и отключусь, на стороне других пользователей я буду отображаться как отключенный.
Я подхожу к этой проблеме неправильно?Должен ли я напрямую подключаться к серверу Jabber (через JavaScript) вместо промежуточного уровня PHP?Как получать сообщения через PHP?
Решение
это внутренняя проблема (или особенность) http - нет постоянных соединений (не совсем).вам нужен обходной путь, реального решения нет.
вы могли бы сделать это с помощью Java или Flash, но это не очень приятно (javascript 4tw!).
Другая возможность — создать промежуточный клиент, который преобразует соединения между браузером и веб-сервером в соединения между веб-сервером и jabber-сервером. грязно, но возможно.
или, может быть, есть API, который поможет в этом.
прямое подключение к Jabber-серверу через JavaScript
Возможно, я проспал последние изобретения ajax, но, черт возьми, вы можете общаться только с хостом, с которого исходит файл исходного HTML (игнорируя greasmonkey и дополнения). никаких разных доменов, никаких разных портов, и точка. если вы не собираетесь научить свой jabber-сервер передавать HTML-страницу чата в браузер, это станет проблематичным.более того, оставаться на связи даже не работает, потому что это потребует многочастных ответов.они поддерживаются только Mozilla, и Вот почему гадкий утенок КОМЕТА вообще существует. Comet сама по себе является обходным решением, позволяющим избежать невозможности удерживать соединения при передаче данных.
Другие советы
Я не пробовал, но вы можете посмотреть xmpphp.Во-вторых, вы можете рассмотреть возможность сохранения входа пользователя на сервер XMPP (он же сервер Jabber) до тех пор, пока он находится на вашем веб-сайте.Вероятно, вам нужен какой-то тайм-аут на случай, если они покинут ваш сайт и не вернутся.
Что касается того, следует ли вам подключаться через JavaScript, я не понимаю, почему вы этого не можете сделать.Я бы посоветовал вам пойти на то, что вам кажется самым простым.Возможно, вы захотите проверить Строфа, о котором я слышал хорошие отзывы в этом случае.
Единственная библиотека XMPP, которую я широко использовал, — это гриф, но для этого необходимо использовать питон и Камаэлия.
Насколько я могу судить, проблема заключается в том, когда пользователь Jabber на другом конце отвечает.Проблема, по крайней мере частично, заключается в том, что пользователь отвечает другому пользователю на Jabber-сервере, но вы хотите, чтобы php-скрипт знал, что этот ответ произошел без открытия соединения (что имеет смысл, поскольку сценарий уже не работает, наверное).
Один из вариантов, хотя и очень глупый:
Имейте PHP-скрипт, который может обеспечить соединение с сервером Jabber для отправки и получения для пользователя на вашей странице,
Используйте AJAX для отправки сообщений пользователю (AJAX будет указывать на приведенный выше сценарий, сценарий отправит сообщение).
Создайте бесконечный цикл Javascript, который проверяет один и тот же сценарий каждые 10 секунд или около того, проверяя, есть ли сообщения.Если они есть, они передаются обратно клиенту и выводятся пользователю.
Из вышесказанного есть только две проблемы:
1) Если пользователь не подключен во время передачи сообщения, будет ли php-скрипт видеть/получать сообщение?
2) Цикл на стороне клиента, который выполняет запросы ajax каждые 3 секунды, вероятно, будет огромным расходом.
Решение 2:
Открытый огонь Джаббер-сервер.Он поставляется со встроенным клиентом веб-чата и дополнением под названием Fastpath, которое предназначено для обработки чатов на основе HTML на стороне клиента (например, функция «поговорить с агентом сейчас!» на слишком многих страницах поддержки).
Мы используем его на работе, и он легко настраивается, его можно интегрировать с другими скриптами (например, если вам нужен скрипт, который заполняет данные пользователя при его входе в систему или добавляет какой-то собственный аватар или что-то еще), и он (OpenFire ) имеет множество других расширений и дополнений, и, если это не то, что вам нужно, вероятно, в них есть то, что вы ищете.