3

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

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

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

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

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

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

(另见此链接

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

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

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

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

4

2 回答 2

0

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

于 2015-03-23T08:07:27.093 回答
0

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

例如看看nodejsape-project (comet)

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

于 2011-06-16T11:04:55.807 回答