如何使用PHP和AJAX改进长轮询功能
我已经使用普通的Apache服务器、PHP、AJAX和Javascript成功地实现了长轮询。我不使用Jquery与服务器通信 问题是Apache服务器的功能有限,服务器不能为5个以上的浏览器选项卡提供服务 我想知道是否有针对Apache或PHP的定制,以使它们处理更多并发连接?或者是否有任何新的/智能的技术可以做到这一点?专门用于长轮询的健壮web服务器可以处理的最大线程数是多少 由于浏览器的兼容性,我对Web套接字不感兴趣。我需要一些简单和强大的PHP。Facebook在做什么?我想知道他们如何处理百万用户的所有动态更新!他们使用什么产品/技术 我的代码示例: srv_polling.php如何使用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在做什么?我想知道他们
<?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机器,一个浏览器中最多有两个选项卡