ajax, long polling, comet - poczytaj, znajdziesz przykłady właśnie z czatami itp.
Można to zrobić na 2 sposoby:
1. Zwykły
Wysyłasz zapytanie AJAX co X sekund i od razu otrzymujesz odpowiedź "jest nowa wiadomość" lub "brak nowej wiadomości". Requesty ajaxowe po nową wiadomość możesz wysyłać albo co X sekund (setInterval) lub ustawiać odebranie za X sekund po odebraniu (setTimeout). Skrypt PHP na jaki się odwołujesz sprawdza czy jest nowa wiadomość i ją wyświetla.
2. Long polling
Wysyłasz od razu request ajax, który czeka aż skrypt PHP zwróci mu wiadomość. Może to być np 10 sekund. Request ajaxowy może dostać nową wiadomość lub info, że nie ma nowych wiadomości. Po odebraniu jakiejkolwiek informacji od razu robisz kolejny request ajaxowy. Skrypt PHP działa wtedy w ten sposób, że ma ustalony czas - np 10 sekund - działania. W tym czasie np. co 0.5 sekundy sprawdza czy są nowe wiadomosci i jeśli jakaś jest od razu ją zwraca.
Doczytaj sobie i wybierz co bardziej będzie pasowało

EDIT: Co do ogólnego systemu jak przekazać wiadomość każdemu użytkownikowi:
Jeśli ma to być czat ogólny, czy nawet jakiś konkretny "pokój" możesz to zrealizować po ID pokoju i czasie.
Przy każdym requeście wysyłasz odpowiednie ID pokoju (przy pobieraniu i wysyłaniu). Zapisując wiadomość (np. w bazie) zapisujesz dokładną datę jej wysłania - najlepiej bardziej szczegółowo niż po sekundach. I jak masz coś takiego to robisz tak:
1. User wchodzi na czat, jako datę do wysłania ustalasz "teraz"
2. Wysyłasz request po wiadomości i dostajesz wiadomości, które pojawiły się po podanej dacie.
3. Z ostaniej przesłanej wiadomości (najnowszej) pobierasz datę i ustawiasz jako datę do wysyłania.
4. Wysyłasz request po wiadomości ...
i punkt 3 i 4 powtarzasz w nieskończoność. W ten sposób najprościej uzyskasz efekt taki, że każdy wchodzący dostanie tylko wiadomości, które były po jego wejściu i nigdy nie dostanie powtórzonych wiadomości.