2011-05-20 58 views
0

我用jQuery写了一个非常简单的AJAX聊天应用程序。它只需通过AJAX将您的消息发送到PHP文件,然后将该消息写入JSON编码的文本文件中供接收器使用。 JSON文件很简单,就像{“userid”:1,“msg”:“hello there”},并且它存储在接收者的用户ID下。一旦接收器检测到文件上的时间戳更改,它就会从中读取JSON数据。Ajax + XMPP或简单的JSON文件+ ajax

这很好,而且速度非常快。但现在我正在考虑扩展等,我不确定这种基于文件系统的聊天如何长期工作。我应该认真考虑一个XMPP服务器并重写它周围的Ajax内容,还是保留我拥有的?提前致谢。

+0

如果您想使用XMPP(即每个聊天记录需要某个jabber服务器上的帐户),为什么不使用像https://www.jappix.com/这样的现有解决方案?它是开源的,像一个真正的jabber客户端。 – ThiefMaster 2011-05-20 23:42:00

回答

1

如果您担心可扩展性,那么即使您的应用根本没有聊天功能,我也一定会考虑replacing AJAX with 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: '[email protected]' + 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

XMPP对于你想要做的事情可能矫枉过正。我会看看某种消息服务器。例如,对于AMQP,你可以使用:

  • RabbitMQ
  • ​​
  • 任何其他AMQP 0.8兼容的经纪人

随着STOMP,你可以使用:

显然,Zend框架有一些所谓的Zend_Queue这也可能是好的。

请参阅this question (What is a good message broker for PHP?)

编辑:

至于为什么你要做到这一点,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 directly from JavaScript。我怀疑安全性很难实现。

+0

谢谢你的回答。我真正在寻找的不一定是其他聊天服务器上的信息,但真正使用文件系统来存储文本文件是一件坏事。我听说过这个,但没有人真的为我证实了这一点。另一个选项是Memcached,但我还没有穿过那座桥。 – Ryan 2011-05-21 02:15:46

+1

@Ryan消息代理可以比文件系统存储更好的原因有两个:消费者可以基于事件而不是轮询(对于计算机来说速度更快,工作更少),IO更少(尽管大多数操作系统在内存中缓存文件)和扩展(您可以将消息代理放在不同的服务器上)。简短的版本是消息代理可能更快。 – 2011-05-21 04:13:20