长轮询 - jquery + php

时间:2013-12-04 09:17:06

标签: javascript php jquery cordova

我想在一个手机短片应用程序中对我的服务器上的脚本进行长时间轮询,以检查服务消息,优惠等内容。

我在js中使用这种技术:

(function poll(){
$.ajax({
    url: "/php/notify.php",
    success: function(results){
        //do stuff here
    },
    dataType: 'json',
    complete: poll, 
    timeout: 30000,
});
})();

将每5分钟开始一次新的投票(当应用程序'暂停'时将停止轮询以避免额外负载)

我不知道如何设置php虽然?我可以设置它,所以它不返回任何东西,只是通过脚本循环,但如何我一旦决定向应用程序发送消息,它会立即返回响应?我到目前为止的PHP代码是:

<?php

include 'message.php';

$counter = 1;

while($counter > 0){
//if the data variable exists (from the included file) then send the message back to the app
if($message != ''){
    // Break out of while loop if we have data
    break;
}
}

//if we get here weve broken out the while loop, so we have a message, but make sure
if($message != ''){
// Send data back
    print(json_encode($message));
}

?>

message.php包含一个$ message变量(数组),它通常是空白的,但是当我想要它时会包含数据。问题是,当我更新message.php中的$ message var时,它不会将响应发送回应用程序,而是等待它超时并且poll()函数再次启动。

所以我的问题是,我如何设置php以便我可以在我的服务器上更新消息并立即发送给任何民意调查?

1 个答案:

答案 0 :(得分:5)

长轮询实际上是非常耗费资源的

你遇到的问题是它每秒都在不断地打开一个连接,在我看来这是非常低效的。根据您的情况,有两种方法可以满足您的需求;使用web sockets的首选方式(我将解释两者):


服务器已发送事件

为了避免效率低下的Ajax超时代码,您可能需要查看Server Sent Events,这是一种旨在为您处理“长轮询”的HTML5技术。以下是它的工作原理:

在JS中:

var source = new EventSource("/php/notify.php");
source.onmessage=function(event) {
  document.getElementById("result").innerHTML+=event.data + "<br>";
};

在PHP中:

  

您可以发送通知&amp;使用SSE API接口的消息。一世   没有任何代码,但如果你想让我创建一个例子,   我会用它来更新这个答案

这会导致Javascript每秒对端点(您的PHP文件)进行长时间轮询,并侦听服务器发送的更新。有点低效,但它的工作原理


<强>的WebSockets

Websockets完全是另一个球赛,并且非常棒

Long-Polling&amp; SSE的工作是不断向服务器打开新请求,“监听”生成的任何信息。问题是这是非常耗费资源的,因此效率很低。解决这个问题的方法是打开一个名为web socket

的持续连接

StackOverflow,Facebook&amp;您在这些服务上享受的所有其他“实时”功能都是通过Web套接字处理的,它们的工作方式与SSE完全相同 - 它们在Javascript&amp;收听来自服务器的任何更新

虽然我们从未对任何websocket技术进行硬编码,但到目前为止,建议您使用第三方套接字服务之一(可靠性和可扩展性)。我们最喜欢的是Pusher