Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ajax] chat/shoutbox - coś w tym stylu
Forum PHP.pl > Forum > Przedszkole
WideSky
Witam.
Zastanawiam się nad technologią shoutboxa. Chciałbym zrobić coś w rodzaju chatu. Ma to działać tak:
W przeglądarce X ktoś wykonuje akcję (przykładowo wysyła wiadomość o jakiejś treści). W tym samym czasie w przeglądarce Y (na innym komputerze lub na tym samym, to nie gra roli) chcę, żeby ktoś otrzymał tę właśnie wiadomość. Oczywiście konieczne będzie przesłanie tej wiadomości do bazy. Moje pytanie brzmi: co dalej? Nie widzę innego sposobu, jak tylko ustawić timeout w przeglądarce na jakąś wartość i co pewną ilość milisekund wykonywać zapytanie sprawdzające, czy przypadkiem nie ma jakichś nowych wiadomości które należy wyświetlić użytkownikowi. Tylko powstaje problem - już przy 10 użytkownikach zacznie się robić sieczka, jeśli każdy powiedzmy co 250 milisekund będzie próbował wysłać do bazy zapytanie. A aplikacja docelowo ma działać na znacznie więcej uzytkowników niż 10, do tego taki chat nie będzie jedyną jej funkcją, a tylko dodatkiem - cała reszta (spora) będzie uzywać tej samej bazy. Według mnie to będzie masakrycznie obciążające, i nie będzie działać w czasie rzeczywistym. A szczególnie zależy mi na tym, żeby opóźnienia nie były duże, 1 sekunda to już za dużo. Jest jakieś inne wyjście?
Poza tym drugim moim problemem jest to, że ustawianie w przeglądarce czasu, co jaki ma się wykonywać zapytanie, wydaje mi się jakieś nieeleganckie, a na pewno obciąża już nawet samą przeglądarkę... Nie da się od razu po wysłaniu wiadomości do bazy przez kogoś pobierać odpowiednie dane? A nie sprawdzać co określony czas, czy jest coś nowego? Chodzi o to, żeby przy małej aktywności uzytkowników (na przykład nocą) ich przeglądarki nie wysyłały masy niepotrzebnych zapytań. No i o to, że trudno ustalić wartość tego timeoutu, 250 milisekund to w pewnych sytuajcach za często, a w pewnych za rzadko. I wolałbym, gdyby od razu po zmianie zawartości bazy (czy jakiegoś pliku, jeśli istnieje taki sposób dla plików, a nie istnieje dla baz), wszyscy inni pobierali tę zaktualizowaną zawartość. Nie wiem, czy się jasno wyraziłem, ale mam nadzieję, ze ktoś mnie zrozumie. Jest jakieś rozwiązanie dla mnie? Chociaż jakiś kompromis? (Tak, wiem, jest - napisać serwle Javy tongue.gif A jakieś inne? smile.gif)
Dziękuję za uwagę.
marcio
Ajax(mintAjax/jquery)+js i hula sam napisalem smile.gif
AxZx
popatrz sie w kod

http://axzx.pl/technologie/

uzylem jquery + odpowiednia funkcja do odswiezania.
marcio
Hehe @AxZx bardzo ladne to masz naprawde gratulacje tu masz uproszczona wersje moja
http://www.marcio.szu.pl
WideSky
@AxZx
No nawet bardzo git, bym powiedział smile.gif
Bardzo ładne wizualnie, choć jest parę drobnych niedoróbek... Ale i tak gratulacje smile.gif

@marcio
Próbowałem się zarejestrować, ale potwierdzenie aktywacji przez maila to drobne przegięcie tongue.gif Nie chciało mi się tongue.gif

No, ale wracam do tematu, bo jednak nie odpowiedzieliście na moje pytanie. Kod AxZx dostępny w przeglądarce jest dość ostro zanieczyszczony, jak go pobiorę to mam wszystko w kilku liniach (tak, wiem, to jest metoda na celowe brudzenie kodu), i nie bardzo nadaje się do odczytania. Moglibyście (obaj) napisać, na czym polega zasada działania takiej aplikacyjki? Bo tak: w shoutboxie AxZx jest przycisk Odśwież. I to jest dobre rozwiązanie, bo nie wymaga wysyłania zapytań wtedy, kiedy nie są potrzebne. Jak użytkownik chce, to sobie odświeża i już. A ja robię coś na kształt takiego shoutboxa, ale jednak nie do końca. To ma być bardziej chat - to znaczy zapytania wysyłane są w tle, bez interakcji użytkownika (czyli przykładowego naciśnięcia jakiegoś przycisku odświeżającego). A jednocześnie nie chcę ich wysyłać co jakiś przedział czasowy, a tylko wtedy, gdy ktoś wyśle jakąś wiadomość/wykona jakąś akcję. Rozumiecie?

P.S. marcio, być może mintAjax i jQuery odpowiadaja na moje pytania, ale nie jestem w temacie, jeśli chodzi o te frameworki. Mógłbyś objaśnić zasadę działania?
marcio
Cytat
Próbowałem się zarejestrować, ale potwierdzenie aktywacji przez maila to drobne przegięcie tongue.gif Nie chciało mi się tongue.gif

A no fakt zapomnialem dac konto testowe
LOGIN:uw_test
HASLO:uw_test

Cytat
P.S. marcio, być może mintAjax i jQuery odpowiadaja na moje pytania, ale nie jestem w temacie, jeśli chodzi o te frameworki. Mógłbyś objaśnić zasadę działania?


http://pl.wikipedia.org/wiki/AJAX
Ogolnie nie znam ani js ani Ajax z js to tylko podstawy podstaw a ajax'a liznolem jak mi byl potzrebny ogola zasada jest taka ze ajax dziala tak jakby w tle bez przeladowania strony dodajac do tego js mozna wykonywac dana funckje co jakis czas

Mysle ze ktos bardziej doswiadczony ci to wytlumaczy tongue.gif

P.S mintAjax to taki prostszy framewor Ajax'a
WideSky
Nie no, link do wikipedii specjalnie potrzebny mi nie jest, googlowac umiem, także nawet gdybym nie wiedział czym jest AJAX, to bez problemu umiałbym sobie to wyszukać. I całą tę technikę też jakoś tam mam opanowaną, to znaczy bez wiekszych problemów napisałbym sobie shoutboxa który pobiera dane z bazy po jakiejś interakcji użytkownika (przykładowo naciśnięcie przycisku, jak to się dzieje w przykładzie). Problem jest w tym, że ja bardziej chcę chat niż taki shoutbox. Czyli automatycznie po wykonaniu akcji przez jednego uzytkownika wszyscy inni widzą, co on zrobił.
Jest to w ogóle realne bez Javy?
marcio
@Nospor o ile sie nie myle napisal cos takiego dziala wysmienicie smile.gif

P.S albo @Cysiaczek
nospor
Cytat
Problem jest w tym, że ja bardziej chcę chat niż taki shoutbox. Czyli automatycznie po wykonaniu akcji przez jednego uzytkownika wszyscy inni widzą, co on zrobił
Nie da sie. serwer nie wysle ci sygnalu do przegladarki. To przegladarka musi co jakis czas odpytywac serwer (czyli ajax) - bedzie to taka samulacja chata, ale nadal to bedzie shoutbox
WideSky
Czyli potwierdzają się moje przypuszczenia, że albo serwlet, albo kiepska wydajność.
Mógłbyś mi powiedzieć, na jakiej zasadzie zbudowany jest ten Twój shoutbox? Przeglądarka co jakiś czas wysyła do serwera zapytanie sprawdzające czy jest jakaś ostatnia wiadomość? Jeśli tak, to co jaki? Czy to nie obciąża całej aplikacji? (Widzę, że dość płynnie chodzi, na pewno długo nad tym pracowałeś). Zapisujesz jakoś czas ostatniej wiadomości i porównujesz? jeśli tak, to gdzie?
Dzięki z góry za jakieś podpowiedzi.

P.S. Tak sobie uruchomiłem klienta pocztowego Gmail i widzę, że tam dynamicznie przychodzą wiadomości, wcale nie muszę nic klikać żeby zobaczyć nowe. Tylko że tam opóźnienia rzędu 1 sekundy nie grają roli, a u mnie tak.
nospor
Cytat
Przeglądarka co jakiś czas wysyła do serwera zapytanie sprawdzające czy jest jakaś ostatnia wiadomość? Jeśli tak, to co jaki?
To u mnie jest parametryzowalne. Kazdy kto sie zainstaluje mego shouta moze sobie ustawić. U mnie teraz jest chyba 10s. W zupelnosci wystarcza.

Cytat
Czy to nie obciąża całej aplikacji
Pobieram tylko nowe wiadomosci. Jak nie ma nic nowego to do bazy nawet nie lece.

Cytat
Zapisujesz jakoś czas ostatniej wiadomości i porównujesz? jeśli tak, to gdzie?
W zmiennej js, a gdziezbys indziej? smile.gif
WideSky
Cytat(nospor @ 5.05.2008, 20:18:47 ) *
Jak nie ma nic nowego to do bazy nawet nie lece.


O, to by mnie urządzało. Ale jak można to osiągnąć? Powiedzmy zapiszę sobie w zmiennej JS czas ostatniej wiadomości. Jak ktoś inny z innej przeglądarki wyśle żądanie sprawdzenia czy są jakieś nowe, to przecież nie widać tej zmiennej, chyba że zapisywać to w jakimś pliku bądź bazie, a to nie ma sensu... bo trzeba się łączyć z bazą, czego całym sposobem próbuję uniknąć tongue.gif
Gdzie popełniam błąd w rozumowaniu? Ta zmienna JS jest widoczna dla wszystkich? W jaki sposób?
nospor
Sorki, troche ci źle powiedzialem. W zmiennej js przechowuje aktualne info dla tej przegladarki. Po stronie serwera zas w pliku zapisuje info ostatniego wpisu. I przed poleceniem do bazy najpierw sprawdzam czy info z przeglądarki jest starsze niz info w pliku.

info* - czas/id/cos innego po czym bedziesz rozpoznawał kolejnosc wpisow
WideSky
Ok, to jeszcze ostatnie pytanie tongue.gif
Co rozumiesz przez sformułowanie `zapisuję info w pliku` ? Że wykonujesz po każdym wysłaniu posta interakcję przeglądarka-serwer przez żądanie AJAX? Dobrze zrozumiałem?
nospor
Ja nie wysylam postow metodą normalną. Jesli ktos napisze wiadomosc to leci żądanie ajaxowe do serwera z tą wiadomością. Ten shoutbox jest calkowicie bezprzeladowywalny winksmiley.jpg
Gość
Nie mam opcji edytuj sad.gif
Bo chciałem zapytać jak z szybkością czegoś takiego...
Mam dwie opcje teraz:
1. Co jakiś określony czas łączę sie z bazą i pobieram to co chcę.
2. Co jakiś określony czas łączę się z plikiem PHP, który nie łączy się z bazą od razu, tylko sprawdza warunek i jeśli jest on spełniony, to dopiero wtedy łączy się z bazą.
Czy drugi sposób aby na pewno jest znacznie szybszy przy wielu użytkownikach i dużej wymianie informacji (każdy pisze coś raz na kilka sekund)?

P.S. Twórcy shoutboxów są w o tyle lepszej sytuacji, że opóźnienie 10 sekund nie gra roli (co sam napisałeś), a ja chcę mieć praktycznie rzeczywisty czas (1 sekunda maksymalnie między jednym a drugim kompem)...
szawel
opcja 2 jest duzo szybsza bo jesli chcesz miec opuznienie jedna sek to bys musial sie loczyc z baza raz na sekunde i sprawdzac a tak tylko sprawdzasz warunek w pliku
WideSky
Cytat(nospor @ 5.05.2008, 20:38:05 ) *
Ja nie wysylam postow metodą normalną. Jesli ktos napisze wiadomosc to leci żądanie ajaxowe do serwera z tą wiadomością. Ten shoutbox jest calkowicie bezprzeladowywalny winksmiley.jpg


Dobra, czyli rozumiem że to wygląda tak:
Wysyłam posta, do pliku PHP jedzie żądanie i w nim przekazana treść i jakieś tam inne parametry. W tym pliku umieszczone jest zapytanie wklejające te informacje do bazy. No i gdzie mam zapisane te informacje (nieważne czy to id, czas, czy co)? Poza bazą nie umiem tego zrobić...
nospor
ad1) najpierw polecisz do skryptu php a dopiero potem do bazy. js sam z siebie z baza sie nie laczy.

Cytat
a ja chcę mieć praktycznie rzeczywisty czas (1 sekunda maksymalnie między jednym a drugim kompem).
Nawet jak ustawisz te jedna sekunde to i tak tego nie osiagniesz w praktyce non stop. czemu? Bo cos sie zmuli na sieci i zanim do serwera dojdzie zadanie to juz moze minac pare sekund, zanim odbierzesz od serwera to kolejne sekundy
WideSky
Wiem właśnie, że 1 sekunda jest nieosiągalna, jeśli ustawię 1 sekundę. Dlatego gdzies tam w pierwszych postach pisałem o 250 milisekundach. Ale sam już nie wiem, czy to dobre wyjście...
Chodzi tylko o to, skąd skrypt PHP wie, że ma się połączyć z bazą... Porównuje id ostatniej wiadomości z czym? I skad bierze informację o tym ostatnim id?
Tak, wiem, ciężko mi się myśli dość, może powinienem to już dawno zrozumieć, ale jakoś nie mogę, wybaczcie tongue.gif
AxZx
Cytat(WideSky @ 5.05.2008, 19:37:57 ) *
@AxZx
No nawet bardzo git, bym powiedział smile.gif
Bardzo ładne wizualnie, choć jest parę drobnych niedoróbek... Ale i tak gratulacje smile.gif

@marcio
Próbowałem się zarejestrować, ale potwierdzenie aktywacji przez maila to drobne przegięcie tongue.gif Nie chciało mi się tongue.gif

No, ale wracam do tematu, bo jednak nie odpowiedzieliście na moje pytanie. Kod AxZx dostępny w przeglądarce jest dość ostro zanieczyszczony, jak go pobiorę to mam wszystko w kilku liniach (tak, wiem, to jest metoda na celowe brudzenie kodu), i nie bardzo nadaje się do odczytania. Moglibyście (obaj) napisać, na czym polega zasada działania takiej aplikacyjki? Bo tak: w shoutboxie AxZx jest przycisk Odśwież. I to jest dobre rozwiązanie, bo nie wymaga wysyłania zapytań wtedy, kiedy nie są potrzebne. Jak użytkownik chce, to sobie odświeża i już. A ja robię coś na kształt takiego shoutboxa, ale jednak nie do końca. To ma być bardziej chat - to znaczy zapytania wysyłane są w tle, bez interakcji użytkownika (czyli przykładowego naciśnięcia jakiegoś przycisku odświeżającego). A jednocześnie nie chcę ich wysyłać co jakiś przedział czasowy, a tylko wtedy, gdy ktoś wyśle jakąś wiadomość/wykona jakąś akcję. Rozumiecie?

P.S. marcio, być może mintAjax i jQuery odpowiadaja na moje pytania, ale nie jestem w temacie, jeśli chodzi o te frameworki. Mógłbyś objaśnić zasadę działania?


nic nie zabrudzalem kodu
jeszcze raz przejrzyj
http://axzx.pl/technologie/tpl/js/main.js
po lewej stronie (zolty box) odswieza sie automatycznie po 2 sekundach, oprocz tego jest link Odśwież (był wczesniej).
kluczem jest funkcja
setInterval('refresh2_shoutbox()', 2000);
WideSky
No rzeczywiście, tutaj zupełnie inaczej to wygląda niż tam w źródle strony, nie wiem czemu...
Ok, rozumiem już. Czyli pobierasz dane co 2 sekundy, albo po naciśnięciu odśwież.
I niestety za bardzo mnie to nie urządza. tongue.gif
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.