api - 使用 Symfony 实现长轮询 API

标签 api symfony1 long-polling persistent-connection

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

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

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

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

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

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

(另见 this link)

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

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

对于第一个问题,我尝试将 persistent: true 放在我的 database.yml Doctrine 连接器中。当我监视服务器连接时,我看到仍然每次访问 API 都会打开一个新连接。所以基本上我仍然被同样的两个问题所困扰。

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

最佳答案

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

例如看看nodejsape-project ( cometd )

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

关于api - 使用 Symfony 实现长轮询 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6369219/

相关文章:

php - 如何从 PHP(使用 Symfony)执行 LESS 编译器?

java - 从 Hibernate XML 配置文件生成实体类和数据库架构

ios - PubNub 长轮询与套接字 - 移动电池生命周期

Jquery Ajax 调用导致 Internet Explorer 崩溃?

javascript - Facebook 社交插件分享按钮

c# - 在 C# 上编写 Messenger Telegram 的难点

api - 在 Postman 中使用路径参数测试 WCF API

javascript - 我如何在 Angular 4中使用刷新 token

php - 无法创建 Doctrine 查询 - 许多 addFrom

HTTP-Long Polling keep-alive 和握手