2013-03-01 40 views
0

以下代碼使網頁加載時間達到10分鐘,我不知道爲什麼!長時間輪詢使用sleep的JQUERY聊天()

function chatheartbeat(){ 
    include("config.php"); 
    $useradn = $_SESSION['displayname']; 
    $query = "select * from chat where (userbdn = '".$useradn."' AND isread = 1) order by id ASC"; 
    $result = mysql_query($query , $link); 
    $num_rows = mysql_num_rows($result); 
    if ($num_rows >= 1) { 
     $items = array(); 
     $i='1'; 
     while($chat = mysql_fetch_array($result)){ 
      $items[$i]['from']=$chat['useradn']; 
      $items[$i]['msg']=$chat['msg']; 
      $items[$i]['timee']=date("H:i" ,$chat['timee']); 
      $i++; 
     } 
     $query = "update chat set isread = 0 where userbdn = '".$useradn."' and isread = 1"; 
     mysql_query($query , $link); 
     header('Content-type: application/json'); 
     echo json_encode($items); 
     exit; 
    }else{ 
     sleep(2); 
     chatheartbeat(); 
    } 
} 

有什麼建議嗎?

+3

我會懷疑的反應永遠不會結束,或者說,從來沒有(幾分鐘)開始發送。 – 2013-03-01 20:42:02

+3

@pst直到遇到堆棧溢出:P – TimWolla 2013-03-01 20:43:45

+0

'config.php'看起來像什麼?你可能需要它來確保你有一個sql連接。 – jeroen 2013-03-01 20:50:05

回答

2

您遞歸猶如其轉到else部分第一次會話變量不會在函數調用之間改變,呼喚你的功能,每次都會去那裏,創造永無止境的循環。順便說一句,如果你想使用輪詢,你應該在客戶端部分設置一個計時器(javascript),而不是在服務器端使用遞歸函數。

+0

第二個參數是在「config.php」 – GuyChabra 2013-03-01 20:49:40

+0

@ user2124281我想到了很多,並刪除了該部分...請參閱我的評論下面你的問題。 – jeroen 2013-03-01 20:50:36

+0

我在JS方面做過settimeout,但我想持有這些請求,直到有新的信息。 – GuyChabra 2013-03-01 20:55:51

2

該功能將永遠不會返回,直到有第一次選擇的結果。

我建議你在n遍歷後返回(例如5),即使沒有結果。然後客戶端可以重新發出ajax調用來再次輪詢。

此外,以遞歸方式執行此操作並不是一個好主意。我會建議在for循環中進行此操作。

1

執行任何長輪詢技術時,有幾件事情需要考慮。

  1. 您需要在某個預定義的時間段後退出。在服務器上等待,直到您有迴應的東西會導致執行超時。

  2. 知道您的SESSION數據正在發生什麼。 PHP在默認情況下將使用基於文件的會話和請求的過程中鎖定該文件(除非你intervine)