使用Symfony实现长轮询API

时间:2011-06-16 08:45:49

标签: api symfony1 long-polling persistent-connection

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

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

  1. 客户端发送带有上次修改时间戳的ajax请求(第一次发送0)
  2. 服务器将客户端的时间戳与时间戳进行比较,以检索时间戳大于用户发送时间戳的所有消息
  3. 如果有更新的消息,请立即将它们返回给客户端,并使用最新消息的时间戳 另一方面,如果没有新消息,请进入2分钟忙等待循环,每隔1-3秒(随机)检查是否有新消息。
  4. 当客户端接收服务器应答时,浏览器更新视图,立即发送新的ajax请求。
  5. 换句话说,服务器不是每隔x秒发送一次AJAX呼叫,而是保留请求,直到它为我们提供新信息。

    对Symfony有很好的经验我尝试实现这个api的一个简单的演示,并且效果很好。我遇到了会话阻塞的问题(ajax调用被保持,因此无法访问服务器),所以我只是将以下内容添加到操作中:

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

    (另见this link

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

    1. 每次访问都会打开一个新的数据库连接
    2. 对于每次访问,服务器都会执行一个新进程
    3. 对于第一个问题,我试图将persistent: true放入我的database.yml Doctrine connetor中。当我监视服务器连接时,我看到仍然每次访问API都会打开一个新连接。所以基本上我仍然遇到了同样的两个问题。

      有没有人对这个问题有任何想法或经验?或者也许我应该放弃用Symfony实现我的api的想法?

2 个答案:

答案 0 :(得分:0)

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

例如,请查看nodejsape-project(彗星)

他们都能够处理比apache,lighttpd或nginx更多的当前用户......

答案 1 :(得分:0)

Apache为每个用户创建不同的线程,每个线程都有一个单独的数据库连接。这就是数据库连接高的原因