2013-05-11 3 views
2

У меня есть панель чата, использующая 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; 
}); 

ответ

2

Вы можете использовать AJAX для отправки новых сообщений на сервере и хранить сообщения в базе данных.

Вы можете заполнить $newMessage, обратившись к общей базе данных.

id: и Last-Event-Id для отслеживания увиденных сообщений и запросов SELECT * FROM chat WHERE id > $last_event_id.

+0

Спасибо за ответ. Я надеялся, что есть способ справиться с этим в памяти вместо использования mysql db. Я полагаю, что может быть не лучший способ, чем дБ. – carter

+1

@carter Вы можете использовать базу данных в памяти, такую ​​как Redis. – Kornel