2014-05-07 78 views
1

我已經使用普通的Apache服務器,PHP,AJAX和Javascript成功實現了長輪詢。我不使用Jquery與服務器進行通信。如何使用PHP和AJAX提高長輪詢功能

問題是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({......}) 

謝謝你的提示!不勝感激。

回答

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 & IDLE_TIME(10 * 3 = 30〜秒)的組合。

但我不認爲你的問題是在服務器端,如果你打開5-6連接從瀏覽器,然後記得每次瀏覽器有限制多少活動連接它可以有一些特定的領域,在同一時間。嘗試差異瀏覽器或更好的差異機器,最多兩個標籤在一個瀏覽器中。