Una idea generale potrebbe essere
Ti crei una tabella con questi campi

utenteDestinatario
messaggio
letto
expire

In ogni pagina di sara una chiamata ajax, che viene richiamata ogni 10 min (ad esempio) e che passa alla funzione php utente connesso
Questa funzione richiama uno script php che legge la tabellla ed estrae tt i messaggi destinati all'utente connesso.
(Contestualmente una volta recuperato puoi fleggare il campo letto, e il campo expire potrebbe essere una data di scadenza del messaggio, dopo la quale non lo mostri più.)
Lo recuperi dalla funzione ajax e lo stampi a video.