2012-01-28 3 views
0

im создание веб-сайта, который использует php для подключения к серверу XMPP, и отправить сообщение Однако у им возникла проблема с отправкой/получением сообщений. Вопрос: мне нужно повторно подключиться и отправить имя пользователя/password каждый раз, когда я делаю запрос (отправлю сообщение)? как избежать повторного подключения?XMPP и PHP потоковая передача

Это, как я подключить:

$this->_socket = fsockopen("sever.tld", 5222, $errno, $errstr, 30); 

я отправлять сообщения с использованием FWRITE Как это:

fwrite($Socket, $data); 

я читал сообщения, используя Fread Как это:

$response = @fread($this->_socket, 1024); 
+0

Как вы подключаетесь? Пожалуйста, покажите нам какой-нибудь код. –

+0

Я добавил код к записи –

ответ

3

Вами подход использование в будущем не будет работать в долгосрочной перспективе.

Поскольку экземпляр PHP фактически прекращает свое существование, когда он завершает отправку страницы обратно клиенту браузера, соединение, которое вы делаете на сервере XMPP, закрывается. Это означает, что все состояние (сеанс TLS, аутентификация, & c) теряется.

Так что да, если вы это сделаете, вам придется повторно подключиться и повторно аутентифицироваться при каждой загрузке страницы.

Пожалуйста, не делайте этого. Вы можете использовать адаптер на стороне XMPP-сервера, такой как XMPP over BOSH, предназначенный для этой цели, или постоянное соединение на стороне HTTP-сервера через какой-то демон или более продолжительный процесс, с которыми сталкиваются ваши экземпляры PHP.

+0

К сожалению, у меня нет доступа к стороне XMPP-сервера. Единственный доступ у меня есть на стороне HTTP-сервера –

+0

@ user1175643 Ну, у вас есть проблема. Время жизни экземпляров PHP меньше времени жизни сеанса XMPP, но сеанс XMPP прекращается, когда соединение TCP закрывается. Вам нужно что-то действовать в качестве привратника здесь. – Borealid

+0

есть ли готовый пакет для этого? –

1

Используйте следующую петлю, чтобы предотвратить соединение от закрытия:

while (!feof($this->_socket)) { 

} 

И разместить все ваши логики внутри. Он будет работать бесконечно в цикле, пока соединение все еще активно (что было бы до тех пор, пока вы его не убьете).