【问题标题】:long polling - jquery + php长轮询 - jquery + php
【发布时间】:2013-12-04 09:17:05
【问题描述】:

我想从 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,以便我可以更新服务器上的消息并将其立即发送给任何轮询的人?

【问题讨论】:

    标签: javascript php jquery cordova


    【解决方案1】:

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

    你遇到的问题是它每秒都在不断地打开一个连接,在我看来这是非常低效的。对于您的情况,有两种方法可以实现您的需求;首选的方式是使用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 中:

    您可以使用 SSE API 接口发送通知和消息。我 手头没有任何代码,但如果你想让我创建一个示例, 我会用它更新这个答案

    这将导致 Javascript 每秒对端点(您的 PHP 文件)进行一次长轮询,以侦听服务器发送的更新。有点低效,但确实有效


    WebSockets

    Websockets 完全是另一种游戏,而且非常棒

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

    StackOverflow、Facebook 和您在这些服务上享受的所有其他“实时”功能都由 Web Sockets 处理,它们的工作方式与 SSE 完全相同——它们在 Javascript 中打开连接并收听任何更新来自服务器

    尽管我们从未对任何 websocket 技术进行硬编码,但到目前为止,我们仍建议您使用其中一种第三方 socket 服务(为了可靠性和可扩展性)。我们最喜欢的是Pusher

    【讨论】:

    • 很好解释,我认为这应该被标记为正确答案,虽然 EventSource 不是所有主要浏览器都支持,click here 但仍然......它很棒选择:)
    猜你喜欢
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 2011-10-20
    • 2012-10-08
    • 1970-01-01
    • 2012-07-03
    • 2012-11-06
    相关资源
    最近更新 更多