Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用PHP和AJAX改进长轮询功能_Php_Ajax_Apache_Long Polling - Fatal编程技术网

如何使用PHP和AJAX改进长轮询功能

如何使用PHP和AJAX改进长轮询功能,php,ajax,apache,long-polling,Php,Ajax,Apache,Long Polling,我已经使用普通的Apache服务器、PHP、AJAX和Javascript成功地实现了长轮询。我不使用Jquery与服务器通信 问题是Apache服务器的功能有限,服务器不能为5个以上的浏览器选项卡提供服务 我想知道是否有针对Apache或PHP的定制,以使它们处理更多并发连接?或者是否有任何新的/智能的技术可以做到这一点?专门用于长轮询的健壮web服务器可以处理的最大线程数是多少 由于浏览器的兼容性,我对Web套接字不感兴趣。我需要一些简单和强大的PHP。Facebook在做什么?我想知道他们

我已经使用普通的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({......})

//要在浏览器端执行的Javascript代码
警报(“结果已更改”);
//再次将AJAX请求发送到同一页面(srv_polling.php):
调用({……})

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

我正在我的项目中使用它

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));
}
它结合了空闲等待和空闲时间(10*3=~30秒)

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