У меня есть панель чата, использующая HTML, CSS, jQuery. Настройте прослушиватель событий без проблем. Настройте файл php файла text/event-stream, который может отправлять сообщения клиенту без проблем. Как мне связываться с клиентом на этот сценарий сервера, чтобы он передавал сообщение всем пользователям, у которых открыт поток событий, после получения нового сообщения от одного из клиентов? Сервер должен отправлять событие только после получения нового сообщения.События, отправленные сервером - Event-Stream - запуск события на стороне сервера 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);
}
Вот ЯШИ:
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;
});
Спасибо за ответ. Я надеялся, что есть способ справиться с этим в памяти вместо использования mysql db. Я полагаю, что может быть не лучший способ, чем дБ. – carter
@carter Вы можете использовать базу данных в памяти, такую как Redis. – Kornel