我正在尝试实现一个在 Symfony 框架中使用长轮询概念的 API。
假设我有一个只能增长的表“提要”(假设用户可以从其他界面插入他们的提要)。我想创建一个客户端实时更新页面。思路如下:
- 客户端发送带有上次修改时间戳的 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 Doctrine 连接器中。当我监控服务器连接时,我发现每次访问 API 都会打开一个新连接。所以基本上我仍然被同样的两个问题所困扰。
有没有人对这个问题有任何想法或经验?或者也许我应该放弃用 Symfony 实现我的 api 的想法?