【发布时间】:2015-08-15 21:41:49
【问题描述】:
我有一个论坛(使用 PHP 和 Symfony2 框架),我想要一些非常接近实时通知的东西。我更具体地想要的是,当用户收到私人消息时,会出现通知。我尝试使用长轮询技术,但遇到了问题。
所以,我从 javascrip 向 php 发送了一个 ajax 调用。 PHP 接收到它并查询数据库以查看是否有任何新的通知给 ajax 请求的用户。如果它找到某些东西,它会返回该结果,否则会休眠 x 秒。这是在一段时间(真)条件下发生的。问题是,如果它没有找到任何东西,它就会休眠,然后再次搜索,然后再次休眠,以此类推,而当这种情况发生时,其他任何东西都不起作用。如果我尝试重新加载页面,单击论坛中的某些内容,阅读主题等等,所有这些都被阻止等待该 ajax 调用完成。我该怎么做才能使 ajax 调用与其他所有内容并行运行,或者在 ajax 未完成时解除对服务器的阻塞。
这就是我在 javascript 中所拥有的:
function poll() {
$.ajax({
type: "post",
url: url to the action from controller,
async: true,
data: { 'userId': $('#userId').attr('data-value') },
dataType: "json",
success: function(result) {
call method to display the notification(s) to the user
setTimeout(poll, 5000);
}
});
};
$(document).ready(function(){
poll();
});
这是来自 Symfony2 控制器的操作:
public function checkForNewNotificationsAction($userId) {
while (true) {
/** @var \Forum\CoreBundle\Entity\Notification[] $notifications */
$notifications = query the database
if ($notifications != null) {
return new JsonResponse($notifications);
} else {
sleep(5);
}
}
}
我还尝试使用“纯”PHP 代码调用常规 PHP 文件,认为来自控制器的操作以及 Symfony2 如何管理控制器正在阻止我的其他活动,但它完全一样。
我试图不使用任何其他“工具”,例如 Node.js 和 Socket.io 或类似的东西,因为我从未使用过它们,而且真的没有时间学习。该项目必须在几天内完成,还有很多工作要做。此外,我试图避免每 x 秒调用一次简单的 ajax 调用,将此作为我的最后选择。
【问题讨论】:
-
你用什么服务器?
-
我使用 Apache 服务器。
-
您的选择是:1) 客户端短轮询,2) 客户端长轮询,3) 与 webSocket 的持续连接。
-
客户端短轮询和长轮询有什么区别?它们的真正含义是什么?
标签: javascript php jquery ajax symfony