2011-06-16 62 views
2

我想实现一个在Symfony框架中使用长轮询概念的API。用Symfony实现长轮询API

假设我有一个只能增长的表'feeds'(假设用户可以从其他界面插入他们的feed)。 我想创建一个客户端实时更新页面。我们的想法是以下内容:

  1. 客户端发送AJAX请求与上次修改的时间戳(第一次发送0)
  2. 服务器客户端的时间戳进行比较,以时间戳,以检索与一个比发送更大的时间戳的所有消息由用户
  3. 如果有更新的消息,立即将它们返回给客户端,并带有最新的消息的时间戳 另一方面,如果没有新消息,则进入2分钟忙等待循环,检查每1-3秒(随机)是否有新消息。
  4. 当客户端接收到服务器应答时,浏览器更新视图并立即发送一个新的ajax请求。

换句话说,服务器不是每隔x秒发送一次AJAX呼叫,而是保存请求直到它为我们提供新信息。

对Symfony有很好的使用经验我试着实现这个api的简单演示,而且效果很好。我有会话阻塞的问题(Ajax调用被保持对服务器的访问是不可能的),所以我只是增加了以下的动作:

public function executeIndex(sfWebRequest $request) 
{ 
    session_write_close(); 
     : 
     : 

(见this link

然后我测试了对API的大量访问。 100个用户工作正常,1000个一切崩溃。 我意识到,我有两个问题:

  1. 对于每一个新的数据库连接打开
  2. 对于每个访问服务器执行一个新的进程

因为我试图把第一个问题访问persistent: true在我的database.yml主义connetor。当我监视服务器连接时,我看到每个对API的访问都会打开一个新的连接。所以基本上我仍然受到同样的两个问题的阻碍。

有没有人有任何想法或经验与此问题?或者,也许我应该放弃使用Symfony实现我的api的想法?

回答

0

我认为使用symfony这是错误的方法。使用套接字会容易得多。

例如看看nodejsape-project(彗星)

他们都能够处理更多的电流用户比Apache,lighttpd的nginx的或...

0

的Apache为每个用户创建不同的线程并且每个线程都有独立的数据库连接。这就是为什么db连接很高的原因