Я сейчас подключаюсь к внешнему XMPP-серверу (не моему).Поскольку я не смог найти ни одного XMPP PHP-клиента, который бы соответствовал моим потребностям, я разработал свой собственный простой клиент ( XMPP PHP) .Клиент открывает сокет-соединение с сервером, и именно здесь происходит обмен XML, и эта часть работает хорошо.
Основной причиной разработки этого пакета была его интеграция в корпоративное приложение.Я сделал это и могу успешно отправлять сообщения туда и обратно.
Несмотря на то, что моя конечная цель - иметь открытое соединение через веб-сокет, в настоящее время программа работает, опрашивая сервер с интервалом в 2 с (я использую простое соединение 1on1, нет чатов или подобное):
receiveMessages: function () {
this.poll = setInterval(function () {
Ext.Ajax.request({
url : 'index.php',
method : 'post',
params : {
method: 'receiveMessages',
},
scope : this,
callback: function (options, success, response) {
...
}
});
}, this.pollTimer);
}
И на стороне PHP:
public function receiveMessages()
{
$messages = $this->client->getMessages();
if ($messages) {
foreach ($messages as $message) {
$message = $this->xml2array($message);
$conversation = $this->conversationExists($message['@attributes']['from']);
if ($conversation == null) {
$preparedConversation = array(
...
);
$conversation = $this->_save($preparedConversation ...);
}
$message = array(
...
);
$response = $this->_save($message ...);
return array(
'success' => true,
'response' => $response,
);
}
}
}
В случае успеха этот метод обновляет интерфейс с полученным сообщением, а также сохраняет сообщение в БД.DB организована таким образом, что у одного User
может быть много Conversations
, а у одного Conversation
может быть много Messages
.
Что я не понимаю, так это то, как все должно быть структурировано, чтобы функционировать как некоторые из реальных клиентов чата (Facebook или другие мессенджеры), потому что таким образом я не могу получить желаемый «параллелизм»,Если я войду в свою учетную запись в 2 разных местах, каждое из них будет опрашивать сервер каждые 2 секунды, и это в основном условие гонки, первое, кто получит сообщение, отобразит его.
Если я подумаю об этом, один из способов сделать это правильно - внедрить веб-сокеты на сервер и ожидать внешнего интерфейса для изменений в БД, однако я думаю, что это может привести к значительным накладным расходам чтения в БД.Может кто-нибудь дать мне совет, как это сделать?