2014-04-03 105 views
1

所以我正在嘗試使用AJAX和PHP在JavaScript中創建一個聊天程序。我目前正在更新這樣的聊天,我敢肯定,這是很難我的服務器上:如何正確處理聊天頁面中的「聊天更新」?

<div id="messages">[no messages]</div> 

這是什麼文件名爲Ajax的負載messages.php

<?php 
    $sql_posts_result = mysql_query("SELECT Post FROM Posts ORDER BY Date ASC LIMIT 50", $db) or die("Can't load post"."<br/>".mysql_error()); 

    if(!empty($sql_posts_result)){ 
     while($row = mysql_fetch_row($sql_posts_result)){ 
      echo '<div class="message-post">'.$row[0].'</div>'; 
     } 
    } 
?> 

和這就是所謂的這個javascript:

setInterval(function(){ 
     $('#messages').load('/ajax-load-messages.php'); 
    }, 3000); 

所以每3秒我加載最後50條消息到#messages div。 我知道有一種方法可以解決這個問題,因爲資源密集程度不是10%,但我不知道從哪裏開始。我該如何處理這個更好?

+0

你是否僅限於使用php? – xCNPx

+0

嗯,不。我也使用JS。 – CyanPrime

+0

我想我的意思是,你有沒有探索過PHP的替代品,比如node.js? – xCNPx

回答

2

給這個表一個int自動增量id。跟蹤收到的最高ID(可能在會話中),並且在下一輪投票中只查找高於該ID的ID(即僅查找自上次投票後創建的記錄)。

0

這將是我的建議,以處理您的聊天系統更好:

1)我會建議使用雙鏈的setTimeout,而不是setInterval的

爲什麼?假設加載時間超過3秒。然後setInterval會打敗它,並導致發生超過1個XML HTTP請求,導致瀏覽器中的壓力。

這是一個連鎖的setTimeout會是什麼樣子在你的榜樣:

setTimeout(function loadMessages() { 
    $("#messages").load('/ajax-load-messages.php', function onLoadMessagesComplete(responseText, textStatus, xmlHttpRequest) { 
     setTimeout(loadMessages, 3000); 
}); 
} 

2)代替Ajax的負載messages.php編寫HTML的,你可以回來JSON對象json_encode()迴應。然後,如果您跟蹤當前顯示的數組中的每個聊天實例的消息,則可以確定是否有新消息(developerwjk的答案是一個好建議)。這樣,您不必每3秒重新加載DOM(不管是否有新消息)。當然,你需要知道瀏覽器中的內存使用情況。

===

通常聊天系統(如Facebook的和Google+)用力推系統,而不是投票。如果有新消息,服務器將推送給客戶端。這減少了對服務器的請求數量,但實施起來可能會更困難。

+0

謝謝。這個「推送系統」的東西,我一直聽到它,但我無法找出它的實際意義,或如何去做。你有什麼想法從哪裏開始? – CyanPrime

+0

我之所以說可能難以實現,是因爲它需要了解websockets以及它如何與PHP一起工作。如果你使用過node.js和socket.io,那麼它很容易得到推送系統。 – hrgui