用Symfony实现长轮询API

用Symfony实现长轮询API,api,symfony1,long-polling,persistent-connection,Api,Symfony1,Long Polling,Persistent Connection,我正在尝试实现一个API,它在Symfony框架中使用长轮询概念 假设我有一个只能增长的表“feed”(假设用户可以从其他接口插入它们的feed)。 我想创建一个客户端实时更新页面。其思路如下: 客户端发送带有上次修改时间戳的ajax请求(第一次发送0) 服务器将客户端的时间戳和时间戳进行比较,以检索时间戳大于用户发送的时间戳的所有消息 如果有较新的消息,请立即将它们返回到客户端,并带有最新消息的时间戳 另一方面,如果没有新消息,则进入2分钟的忙等待循环,每1-3秒(随机)检查是否有新消息 当客

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

假设我有一个只能增长的表“feed”(假设用户可以从其他接口插入它们的feed)。 我想创建一个客户端实时更新页面。其思路如下:

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

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

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

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

  • 对于每次访问,都会打开一个新的数据库连接
  • 对于每次访问,服务器都执行一个新进程
  • 对于第一个问题,我尝试将
    persistent:true
    放入我的database.yml connetor。当我监视服务器连接时,我发现每次访问API都会打开一个新的连接。所以基本上我还是被同样的两个问题所困扰


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

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

    例如,看一看或(彗星)


    它们都能够处理比apache、lighttpd或nginx多得多的当前用户…

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