Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript][PHP]Komunikator
Forum PHP.pl > Forum > Przedszkole
CPoDe
Witam, piszę komunikator (czat) i nie za bardzo wiem jak zrobić tak aby w momencie kiedy ktoś wyśle jakąś wiadomość to pojawiała się u wszystkich użytkowników ;/
Gość
ajax
Sephirus
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 wink.gif

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.
CPoDe
Istnieje możliwość pominięcia prośby(requestu?) użytkownika o informacje? Chciałbym aby użytkownik jedynie zakomunikował iż jest w pokoju, a następnie aby serwer sam przysyłał mu nowe wiadomości, bez jego ciągłego upominania się o nie.

PS. chodzi mi o coś sprawniejszego niż Long Polling, ponieważ z tego co się orientuje to obciąży on znacząco serwer, który będzie musiał wyczekiwać nowej wiadomości. Chyba że się mylę?
Sephirus
Nie mylisz się - to będzie obciażało. Ale sprytnie zrobione na bazie danych (mechanizm memory) albo na jakimś systemie do cache (APC, MEMCACHE) taki czat by śmigał nie obciażajac aż tak - chyba że odpytywałbyś w skrypcie który działa 10 sekund co 10 milisekund czy coś nowego się pojawiło tongue.gif

Ja jak już muszę na PHP (bo to nie jest do tego najlepsze) to robię 10 sekundowy long-poll ze skryptem sprawdzajacym co 0.5sekundy czy w APC nie ma nowych wiadomości.
Wiadomości zapisuje w bazie normalnie (w celach archiwalnych) ale przy działaniu czatu ich stamtad nie pobieram - działa to nawet sprawie dla sporej liczby userów - jednakże jakby miał to być wielki silnik czat to raczej stawiałbym na oddzielna apke słuchajaca na jakimś porcie (JAVA,C,nodeJs) itp..

To o czym mowisz ogolnie to server push... niestety nie da się tego zrobić w PHP i jedynym rozwiazaniem jest właśnie long-poll albo cykliczne odpytywanie. Serwer sam z siebie nie wyśle nic do przegladarki.

Można to też obejść właśnie poprzez użycie innych języków (JAVA itp). Wówczas otwierasz tylko odpowiednie sockety (websocket w JS przykładowo albo applet Javy itp) i masz komunikację dwustronna.

Na Twoim miejscu zaczał bym od stworzenia prostego czatu na cyklicznym odpytywaniu - będa opóźnienia w odpoiwedziach ale jeśli nie ma to być profesjonalny czat to jest to akceptowalne, spróbuj potem zastosować long-poll (przemyślany) i sprawdź obciażenie - na koniec możesz kombinować z wyższymi językami/technikami - dużo się w ten sposób nauczysz wink.gif
CPoDe
Dziękuję za odpowiedź wink.gif

PS. mam jeszcze pytanie, ponieważ w internecie znalazłem coś takiego jak "Server-Sent Events" które jest dostepne w HTML5. Orientuje się ktoś może jak to działa ?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.