我正在尝试在Symfony框架中实现一个使用长轮询概念的API。
假设我有一个名为“feeds”的表,它只能增长(假设用户可以从其他接口插入他们的feed)。我想创建一个客户端实时更新的页面。思路如下:
1. 客户端发送带有上次修改时间戳的Ajax请求(第一次发送0)。 2. 服务器将客户端的时间戳与时间戳进行比较,检索所有时间戳大于用户发送的时间戳的消息。 3. 如果有更新的消息,立即将它们返回给客户端,并附带最新消息的时间戳。另一方面,如果没有新消息,则进入2分钟的繁忙等待循环,在1-3秒(随机)内检查是否有新消息。 4. 当客户端收到服务器的响应后,浏览器会更新视图并立即发送新的Ajax请求。
换句话说,服务器会保留请求,直到它有新信息才发送响应,而不是每x秒发送一次AJAX调用。
由于我对Symfony有丰富的经验,因此我尝试实现了这个API的简单演示,并且它运行得非常好。我遇到了会话阻塞的问题(Ajax调用被保留,因此无法访问服务器),因此我只需将以下内容添加到操作中即可:
(另请参见此链接)
然后我测试了对API的大量访问。100个用户可以正常工作,而1000个用户会导致所有内容崩溃。
我意识到有两个问题:
有人有任何想法或经验吗?或者我应该放弃使用Symfony实现我的API的想法吗?
假设我有一个名为“feeds”的表,它只能增长(假设用户可以从其他接口插入他们的feed)。我想创建一个客户端实时更新的页面。思路如下:
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个用户会导致所有内容崩溃。
我意识到有两个问题:
- 每次访问都会打开一个新的数据库连接。
- 每次访问服务器都会执行一个新的进程。
persistent: true
。当我监视服务器连接时,我发现每次访问API仍会打开一个新的连接。因此,基本上我仍然被同样的两个问题所困扰。有人有任何想法或经验吗?或者我应该放弃使用Symfony实现我的API的想法吗?