Ajax + XMPP или простой файл JSON + ajax - PullRequest
0 голосов
/ 21 мая 2011

Я написал очень простое приложение для чата AJAX с jQuery.Он просто отправляет ваше сообщение в файл PHP через AJAX, а затем записывает это сообщение в кодировке JSON в текстовый файл, чтобы получатель мог его забрать.Файл JSON прост, как {"userid": 1, "msg": "hello there"}, и хранится под идентификатором пользователя получателя.Как только получатель обнаруживает изменение метки времени в файле, он считывает из него данные JSON.

Это работает хорошо и очень быстро.Но теперь я думаю о масштабировании и т. Д., И я не уверен, как подобный чат на файловой системе будет работать долго.Должен ли я серьезно рассмотреть XMPP-сервер и переписать Ajax вокруг него или оставить то, что у меня есть?Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 14 июня 2012

Если вас интересует масштабируемость, то я бы определенно рассмотрел замену AJAX на XMPP , даже если ваше приложение вообще не имеет возможности чата.Хотя XMPP имеет большую сложность на уровне протокола, Strophe отлично справляется с абстрагированием этой сложности.Вот пример кода, который делает XMPP эквивалентным вызову AJAX.

/**
 * handle the response from the search request
 * @param {Element} retStanza contains the iq result packet
 */
com.dynamicalsoftware.opeye.admin.Category.prototype.handleSearchResult = function(retStanza) {
    var a = goog.dom.getElement(com.dynamicalsoftware.opeye.admin.appAreaId);
    goog.dom.removeChildren(a);
    var categories = iqresult.getElementsByTagName('category');
    for (i=0; i<categories.length; i++) {
    new com.dynamicalsoftware.opeye.admin.Category(com.dynamicalsoftware.opeye.admin.GuiMode.SEARCHRESULT, categories[i]).render(parentDivTabContent);
    }
}

/**
 * perform a search operation
 * @private
 */
com.dynamicalsoftware.opeye.admin.Category.prototype.search = function() {
    var request = $iq({to: 'category@' + com.dynamicalsoftware.opeye.admin.domain, type: 'get'}).c('query', {xmlns: 'http://www.dynamicalsoftware.com/opeye/admin/category'});
    var outstanza = request.tree();
    connection.sendIQ(outstanza, this.handleSearchResult.bind(this));
}
1 голос
/ 21 мая 2011

XMPP может быть излишним из-за того, что вы пытаетесь сделать. Я бы посмотрел на какой-нибудь сервер сообщений. Например, с AMQP вы можете использовать:

С STOMP вы можете использовать:

Очевидно, в Zend Framework есть что-то под названием Zend_Queue , что также может быть неплохо.

См. этот вопрос (Что такое хороший брокер сообщений для PHP?) .

EDIT:

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

Чтобы отправить сообщение, вы должны сделать что-то вроде этого (используя PHP Stomp ):

<?
require_once("Stomp.php");

$connection = new Stomp("tcp://your-activemq-server:61613");
$connection->connect();
$connection->send("/queue/someOtherUser", "Hey buddy, let's talk.");
$connection->disconnect();
?>

Затем забрать сообщения:

<?
require_once("Stomp.php");

$connection = new Stomp("tcp://your-activemq-server:61613");
$connection->connect();
$connection->subscribe("/queue/myQueue");
while(($message = $connection->readFrame()) != null) {
    echo $message->body;
    $connection->ack($message); // Tell the broker that you handled the message
}
$connection->disconnect();
?>

Конечно, в реальной ситуации вы, вероятно, захотите установить заголовок, в котором указано, от кого получено сообщение, до его отправки, но я не совсем уверен, как именно вы отправляете / получаете заголовки в этой библиотеке.

Еще лучшим вариантом может быть нажатие ActiveMQ напрямую из JavaScript . Я подозреваю, что безопасность будет трудно реализовать, хотя.

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