我正在尝试实现一个在 Symfony 框架中使用长轮询概念的 API。
假设我有一个只能增长的表“提要”(假设用户可以从其他界面插入他们的提要)。 我想创建一个客户端实时更新页面。思路如下:
- 客户端发送带有最后修改时间戳的ajax请求(第一次发送0)
- 服务器将客户端的时间戳与时间戳进行比较,以检索所有时间戳大于用户发送的消息
- 如果有更新的消息,立即返回给客户端,并带有最新消息的时间戳 另一方面,如果没有新消息,则进入 2 分钟的忙等待循环,每 1-3 秒(随机)检查是否有新消息。
- 当客户端收到服务器响应时,浏览器会更新 View 并立即发送一个新的 ajax 请求。
换句话说,服务器不会每隔 x 秒发送一次 AJAX 调用,而是会保留请求,直到它为我们提供新信息为止。
凭借 Symfony 的良好经验,我尝试实现此 api 的简单演示,并且效果很好。我遇到了 session 阻塞问题(ajax 调用被保留,因此无法访问服务器),所以我只是将以下内容添加到操作中:
public function executeIndex(sfWebRequest $request)
{
session_write_close();
:
:
(另见 this link)
然后我测试对 API 的大量访问。 100 个用户工作正常,1000 个一切都崩溃了。 我意识到我有两个问题:
- 每次访问都会打开一个新的数据库连接
- 对于每次访问,服务器都执行一个新进程
对于第一个问题,我尝试将 persistent: true
放在我的 database.yml Doctrine 连接器中。当我监视服务器连接时,我看到仍然每次访问 API 都会打开一个新连接。所以基本上我仍然被同样的两个问题所困扰。
有没有人对这个问题有任何想法或经验?或者我应该放弃用 Symfony 实现我的 api 的想法??
最佳答案
我认为为此使用 symfony 是错误的方法。使用套接字会容易得多。
例如看看nodejs或 ape-project ( cometd )
与 apache、lighttpd 或 nginx 相比,它们都能够处理更多的当前用户...
关于api - 使用 Symfony 实现长轮询 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6369219/