我想从phonegap应用程序中长时间轮询我的服务器上的脚本,以检查服务消息、优惠等内容。
我在 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,以便我可以更新服务器上的消息并将其立即发送给任何轮询的人?
最佳答案
长轮询实际上需要大量资源才能实现其目标
你遇到的问题是它每秒不断地打开一个连接,在我看来这是非常低效的。根据您的情况,有两种方法可以实现您的需求;首选方法是使用网络套接字
(我将解释两者):
服务器发送事件
为了避免低效的 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 中:
You can send notifications & messages using the SSE API interface. I don't have any code at hand, but if you want me to create an example, I'll update this answer with it
这将导致 Javascript 每秒对端点(您的 PHP 文件)进行长轮询,监听服务器发送的更新。虽然效率有点低,但确实有效
<小时/>WebSocket
Websockets 完全是另一种球类游戏,而且非常棒
长轮询和 SSE 的工作方式是不断向服务器打开新请求,“监听”生成的任何信息。问题在于,这是非常资源密集型的,因此效率相当低。解决这个问题的方法是打开一个名为 web socket 的持续连接。
StackOverflow、Facebook 以及您在这些服务上享受的所有其他“实时”功能都是通过 Web Sockets 处理的,它们的工作方式与 SSE 完全相同 - 它们在 Javascript 中打开连接并监听任何更新来自服务器
尽管我们从未对任何 Websocket 技术进行硬编码,但迄今为止建议您使用第三方套接字服务之一(为了可靠性和可扩展性)。我们最喜欢的是Pusher
关于javascript - 长轮询 - jquery + php,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20371290/