2013-05-11 178 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