javascript - 长轮询 - jquery + php

标签 javascript php jquery cordova

我想从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/

相关文章:

Javascript 动画仅在到达网页的特定部分时触发

php - 检查变量是否是PHP的日期?

javascript - 使用 Javascript 模拟远程 => 真实链接点击

javascript - 单击按钮时如何显示从特定 API 新随机生成的报价?

JavaScript 多维数组

javascript - 如何使用javascript中的正则表达式替换cookie字符串中的cookie值

php - mysql插入后如何最好地访问警报数据

php - 使用 php 和 mysql 在 iF​​rame V2 中显示特定的 URL

jquery - ipad/iphone 视频无法切换到全屏模式

jQuery 获取页面中所有元素的文本