2013-05-11 279 views
2

我有一個使用HTML,CSS,jQuery的聊天面板。設置一個沒有問題的事件監聽器。設置一個文本/事件流PHP文件,可以發送消息給客戶端沒有問題。我如何從客戶端與此服務器腳本進行通信,以便在收到來自任何一個客戶端的新消息後,向所有打開了事件流的用戶廣播消息?服務器只應在接收到新消息時發送事件。服務器發送事件 - 事件流 - 觸發PHP服務器端事件?

這裏是message_sender.php:

header('Content-Type: text/event-stream'); 
header('Cache-Control: no-cache'); 

while (1) { 
if ($newMessage){ //How does $newMessage get filled in an already running script? 
    echo "id: 1234\n"; 
    echo "event: ping\n"; 
    echo 'data: {"newMessage": "' . $newMessage . '"}'; 
    echo "\n\n"; 
} 

ob_flush(); 
flush(); 
sleep(1); 
} 

這裏是JS:

var evtSource = new EventSource("message_sender.php"); 

evtSource.onmessage = function(e) { 
} 

evtSource.addEventListener("ping", function(e) { 
var newElement = document.createElement("li");  
var obj = JSON.parse(e.data); 
newElement.innerHTML = "ping " + obj.newMessage; 
$('#chat_panel').append(newElement); 
}, false); 

evtSource.onerror = function(e) { 
    alert("EventSource failed."); 
}; 

$('#message_form').submit(function(e){ 
e.preventDefault(); 
var message = $('#txtb_chat').val(); 

$.ajax({ 
    type: 'POST', 
    dataType: 'json', 
    data: message, 
    url: 'message_processor.php', 
    beforeSend: function(){ 

    }, 
    success: function(){ 
    $('#txtb_chat').val(""); 
    } 
}); 
return false; 
}); 

回答

2

您可以使用AJAX在數據庫發送給服務器和存儲郵件的新郵件。

您可以通過查詢共享數據庫來填寫$newMessage

您可以使用id:Last-Event-Id來跟蹤客戶端看到的消息和查詢SELECT * FROM chat WHERE id > $last_event_id

+0

感謝您的回覆。我希望有一種方法可以在內存中處理,而不是使用mysql數據庫。我想可能沒有比db更好的方法。 – carter 2013-09-01 19:39:00

+1

@carter您可以像Redis一樣使用內存數據庫。 – Kornel 2013-09-01 21:21:16