如何使用PHP和AJAX提高长轮询功能

时间:2014-05-07 12:59:16

标签: php ajax apache long-polling

我使用普通的Apache服务器,PHP,AJAX和Javascript成功实现了长轮询。我不使用Jquery与服务器通信。

问题是Apache服务器功能有限,服务器无法提供超过5个浏览器选项卡。

我想知道是否有任何自定义的Apache或PHP来使它们处理更多的并发连接?或者,如果有任何新的/智能技术可以做到这一点?专用于长轮询的强大Web服务器可以处理哪些最大线程?

由于浏览器兼容性,我对Web套接字不感兴趣。 PHP需要一些简单而强大的东西。 Facebook正在做什么?我想知道他们如何处理数百万用户的所有动态更新!他们使用什么产品/技术?

我的代码示例:

srv_polling.php

<?php
function getResults(){..... return result;}

// recursive function inside the server 
function hasResultChanged($old,$timeStart){

    // to avoid server timeout (in seconds) in case no change for results
    if(round(abs(time() - $timeStart) / 60*60,2) > 50)
        return;

    $new = getResults();

    if($new != $old)    // get back to browser
        return true;
    else{
        $old = getResults();
        sleep(2);
        return $hasResultChanged($old,$timeStart);

    }
}

$timeStart = time();
$old  = $getResults();
sleep(2);
$hasResultChanged($old,$timeStart);

?>

// Javascript code to be executed at browser end
alert('Result has changed');

// Send AJAX request again to same page(srv_polling.php):
ajax.call({......})

感谢您的提示!非常感谢。

1 个答案:

答案 0 :(得分:0)

我在我的项目中使用它

public function getLPollData($user, $handlerName) {
    set_time_limit (600);
    date_default_timezone_set('Europe/Berlin');
    $counterEnd = (int)$_REQUEST["counterEnd"];
    $counterStart = (int)$_REQUEST["counterStart"];
    $this->expireNotifications($counterStart, $counterEnd);
    $secCount = IDLE_WAIT;
    do {
        sleep(IDLE_TIME);
        $updates = $this->fetchAllNotifications($counterEnd);
    } while (!$updates && ($secCount--)>0);

    if($updates){

    }

    header("HTTP/1.0 200");
    return sprintf ('{"time" : "%s", "counter" : "%d", start : %d, data : %s}'
            , date('d/m H:i:s'), $counterEnd,$counterStart,json_encode($updates));
}

IDLE_WAIT&amp;的组合IDLE_TIME(10 * 3 = ~30秒)。

但我不认为你的问题出在服务器端,如果你从浏览器打开5-6个连接,那么记住每个浏览器一次限制它可以对某个特定域有多少个活动连接。尝试差异浏览器或更好的差异机器,在一个浏览器中最多两个选项卡。