Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [założenia projektu] chat - relacja z bazą danych dotycząca nowych danych
Forum PHP.pl > Forum > PHP
Athlan
Ostatnio odbiła mi pała i postanowiłem napisać sobie chata. Przyjmuję że każdy będzie wiedział o co mi chodzi.

Głównym moim problemem jest odświeżanie okna dialogowego. Głupi pomysł, ale nie umiałem wymyśleć lepszego: okno odświeża się co 1 sec tongue.gif, analogicznie działa lista osob na chacie.

I teraz kieruje pytanie do Was koledzy smile.gif

Jak zrobić (teoria, może przyklady jakieś, zarzucicie jakimś kodem smile.gif ), aby okno dialogowe jak i lista osób online osświeżała się tylko wtedy, gdy dojdą nowe dane ? jak to sprawdzić nie przeciążając bazy danych?

oczywiście: jak najmniej JavaScriptu smile.gif

Pozdrawiam, Athlan smile.gif
artur81
nie wiem czy dobrym rozwiązanie jest odświeżanie strony co sekunde, zrobisz jakąś szatę graficzną,
przykładowo niech plik razem ze zdjęciam waży 5 kb, jak szybko skończy ci się limit transferu na serwerze? Chyba że piszesz dla siebie na locala, poza tym możesz sprobować z Ajaxem i do diva na stronie wstawiać ostatni dodany wiersz a reszta automatycznie do góry.
Turgon
Ajax Ci zdecydowanie polecam, podobno świetnie sie sprawdza. Przeczytaj na blogu hwao notkę o czacie winksmiley.jpg . Tam jest all smile.gif .
Athlan
No dobra... fajnym pomysłem jest dodanie div'a smile.gif i dodawanie tam informacji (przyjmę to, dzięki smile.gif ), ale co z operacjami na bazie danych? chyba nie ebde sprawdzał co sekundę czy mam coś dodać do div'a, skoro właśnie to jest największym obciążeniem bazy danych smile.gif

pozdrawiam smile.gif
NetJaro
Już kiedyś to napisał - do chatu najlepszy rozwiązaniem jest AJAX. Pisałem mały chat dla zabawy w AJAX'ie (dla zabawy z AJAX'em) - wyszedł lepiej niz myślałem smile.gif Tylko i wyłącznie AJAX. Możesz też zobaczyć jak działa chat na Home.pl.
Athlan
no dobra... zaczne się uczyć AJAX'a ale jak to ma dokładnie działać? co sekundę wysyla zapytanie do bazy czy są nowe wiadomości? no bez przesady tongue.gif

jakieś pomysły o sprawdzanie nowych wiadomości ?
Turgon
Po kiego grzyba co sekundę smile.gif .



---
Juz raz dostałes ostrzeżenie za nabijanie posów.
Widzę że nadal to robisz.
Jak masz coś do przekaznia konkretnego to pisz, jak nie to się wstrzymaj.
~mike_mech
Athlan
@Turgon wyczerpująca wypowiedź... to jak też wyczerpująco: bo tak tongue.gif

a ta na serio: no trzeba być na aktualce... ten chat bedzie przeznacvzony do konferencji ale narazie jest raczej... shoutbox'em smile.gif

ponawiam pytanie:
zaczne się uczyć AJAX'a ale jak to ma dokładnie działać? smile.gif

pozdrawiam serdecznie smile.gif
kossa
Cytat(NetJaro @ 9.08.2006, 10:18 ) *
Już kiedyś to napisał - do chatu najlepszy rozwiązaniem jest AJAX. Pisałem mały chat dla zabawy w AJAX'ie (dla zabawy z AJAX'em) - wyszedł lepiej niz myślałem smile.gif Tylko i wyłącznie AJAX. Możesz też zobaczyć jak działa chat na Home.pl.



@NetJaro na home.pl rozmowa z konsultantem odświeża całą stronę, czy to ten Twój czat? czy nie to co trzeba oglądam? chciałbym zobaczyc jak to działa.

Łukasz
Athlan
@kossa no coś Ty, takie badziewie, mam lepsze i sie samo odświeża nawet tongue.gif Hmmm, a da sie jakos bez AJAX'a pobrać, czy nadeszły jakieś nowe wiadomości, np od ostatniego odświeżenie i potem dopiero wywołać zapytanie?

czy to nie obciązy bazy jak wykonam np zapytanie: czy jest jakaś nowa message od ostatniego refreshu i tak co 1 sec?

(krótkie zapytanie ale jednak obciąża)

pozdrawiam smile.gif
Apo
Boże weź poczytaj na jakiej zasadzie działa Ajax i reszte juz będziesz wiedział. Btw jest juz kilka takich topiców.

Cytat
czy to nie obciązy bazy jak wykonam np zapytanie: czy jest jakaś nowa message od ostatniego refreshu i tak co 1 sec?

po co ?
Athlan
Cytat
Boże weź poczytaj na jakiej zasadzie działa Ajax

Wiesz... zawsze jak zakładam topick czytam najpierw dokumentację smile.gif

pomyślałem o takie rozwiązaniu: Ajax sprawdza zapytaniem czy nie ma nowszych informacji niż ostatnia data zawarta w sesji, jezeli są... dodawane są indormacje do DIV'a, jeżeli nie ma, ustawaimy datę sesji na aktualną

powinno być dobre smile.gif można zamknąć smile.gif

pozdrawiam smile.gif

--EDIT--

@Apo - a jak chcesz sprawdzić czy są nowe messagesy? samo nie przydzie smile.gif
Apo
lol. A słyszałem że jesteś najlepszy, masta i wogle ...

Przy dodawaniu nowego wpisu ajax wysyła tresc do php, nastepnie php zapisuje dane w bazie i odczytuje wpisy, które następnie przesyła spowrotem do ajax'a a ten je wyświetla w divie...
Athlan
Cytat
Przy dodawaniu nowego wpisu ajax wysyła tresc do php, nastepnie php zapisuje dane w bazie i odczytuje wpisy, które następnie przesyła spowrotem do ajax'a a ten je wyświetla w divie...


no a jak ktoś nic nie pisze? to jak dostanie nowe wiadomości napisane przez innych?

Cytat
lol. A słyszałem że jesteś najlepszy, masta i wogle ...

dzieki guitar.gif

pozdro smile.gif
mike
Cytat(Apo @ 9.08.2006, 12:16 ) *
nastepnie php zapisuje dane w bazie i odczytuje wpisy, które następnie przesyła spowrotem do ajax'a a ten je wyświetla w divie...

Po pierwsze to co jak jak ja nic nie napiszę, to co będzie?
Po drugie: "następnie przesyła spowrotem do ajax'a" - niewinnie się pisze, ale ciekaw jestm jak to zrobisz? Musiałbyś nasłuchiwać czekając na dpowiedź, albo pytać co jakiś czas czy coś jest. Na przykład co sekundę.

Inaczej nie da rady tylko pytać co 1sek.
Coyote
chyba ze w momencie dodania przez usera wiadomosci or smth wysylac zapytanie przez ajaxa ....
Apo
Cytat(mike_mech @ 9.08.2006, 10:39 ) *
Po pierwsze to co jak jak ja nic nie napiszę, to co będzie?
Po drugie: "następnie przesyła spowrotem do ajax'a" - niewinnie się pisze, ale ciekaw jestm jak to zrobisz? Musiałbyś nasłuchiwać czekając na dpowiedź, albo pytać co jakiś czas czy coś jest. Na przykład co sekundę.


1. Jak nic nie napiszesz to nic sie nie zrobi smile.gif
2. Dawno nie używałem Ajaxa ale opisze to jak ja to widze:
User wysyła treść wpisu -> Ajax przekazuje ją do php -> php zapisuje treść w bazie -> php odczytuje treści i wyświetla je -> Ajax przekazuje treść jako Response.Text (chyba tak to sie nazywało) smile.gif
Athlan
Cytat
1. Jak nic nie napiszesz to nic sie nie zrobi

no a ma sie automatic zrobić tongue.gif czyli refresh, myślałem o 1 sekundzie, ale przecież broń dalekiego zasięgu na naszą bazę danych sad.gif

user jeżeli coś napisze to mu sie odświeży a jak nic nie napisze to musi mu się odświeżyć samo... chyba logiczne tongue.gif
mike
~Athlan ja wiem jak to zrobić.
Pytałem retorycznie ~Apo, który napisał "które następnie przesyła spowrotem do ajax'a a ten je wyświetla w divie"

O mija logike to Ty się nie martw tongue.gif
bim2
Poprostu np. co 5 sec pobieraj ajaxem jaka zawartość ma się wstawić do diva tongue.gif (zopbacz na mojej stornie shouta (sam ajax) http://nfscg.info/x-trim3/) Wysyłasz zapytanie do pliku php, gdzie pobiera on z bazy danych wszystkie odpowiedzi (lub np. 5) i wstrzykujesz je do diva smile.gif Proste, tylko nie wiem jak na to wychodzi obciążenie z bazą. Spytam sie testujac około 10 userów tongue.gif i powiem co z bazą danych biggrin.gif
nospor
jesli juz tak bardzo bazy nie chcesz ruszac to mozesz zaprzac do tego jeden plik.

Plik bedzie zawieral ID ostatnio dodanej wiadomości. Czyli ktos cos pisze, zapisuje sie to do bazy i potem do pliku wstawiany jest ID tej ostatniej wiadomosci.

A teraz ludki, ktorzy czytaja:
wysylasz se ajaxem co x sekund requesta. W request zapisujesz ID ostatnio pobranej wiadomosci lub bez ID, jesli jeszcze nic nie pobrales. Teraz serwer odbiera ten request i jesli nie ma ID, to zaczytuje z bazy nowosc. Jesli jest ID to sprawdza czy to ID jest takie samo jak w pliku. Jesli takie samo - to nie ma co biec do bazy. jesli jednak inne, znaczy ze jest nowa wiadomosc i trzeba biec do bazy.

W ten sposob do bazy bedziesz biegal tylko gdy beda nowe wiadomosci
Athlan
@bim2 - no chcesz zrobić tak jak ja, ale to zakładamy przy 30 osobach (konferencja) to nieźle obciąża bazę...

@nospor - niezłe smile.gif a może tak by dla każdego usera trzymać jego ostatio odebrane ID messagesa w sesji żeby pliku nie męczyć?

tak samo z dołączeniem do chata... generowany jest czas joinu i nie weźmie messagesów wcześniej napisanych... przy komendzie /clear czyści DIV'a i ustawia jina na aktualny czas... nooo teraz problem wygląda w miarę klarownie smile.gif

pozdrawiam smile.gif
DjKermit
A może Flash i FlashComm lub XMLSocket ?
Zdecydowanie wydajniej tongue.gif
Athlan
@DjKermit własnie chodzi o to że na php smile.gif na flashu to robimy chata z kumplem: http://www.flash-chat.pl (zajmuje sie integracją z phpBB i takimi tam)...

chodzi o to, aby porzucić technologię flash i przejść na php czyste smile.gif

pozdrawiam smile.gif
nospor
Cytat
a może tak by dla każdego usera trzymać jego ostatio odebrane ID messagesa w sesji żeby pliku nie męczyć
Sesja to w zasadzie tez plik winksmiley.jpg na dodatek zakladany dla kazdego usera. A moj plik co mowilem jest jeden na wszystkich.
Pozatym napisales, ze chcesz tam trzymasz ID ostatnio odebranej wiadomosci, a nie ID ostatnio dodanej. To troche inaczej niz mowilem. Co ci po ID ostatnio pobranej? Musisz wiedziec jaka byla ostatnia dodana. Ostatnio pobrana to tak jak mowilem w REQUEST przekazywac (od biedy i w sesji to mozna trzymac). Tak czy siak plik na ostatnie ID musi byc
mike
~nospor a mi to rozwiązanie się nie podoba tongue.gif
Taki plik nie da rady i dla 10 osób po kilku minutach romowy padnie, wyzeruje się czy coś.

Pliki są zawodne w takich sytuacjach i to bardzo.
nospor
e tam. ja nigdy nie mialem problemow z plikami, nie zerowaly mi sie ani nic takiego. Kwestia umiejętnego ich uzywania tongue.gif

edit: a nawet jak sie wyzeruje, to najzwyklej w swiecie pobierze sie ostanie ID i zapisze jeszcze raz. winksmiley.jpg
mike
Cytat(nospor @ 10.08.2006, 08:36 ) *
e tam. ja nigdy nie mialem problemow z plikami, nie zerowaly mi sie ani nic takiego. Kwestia umiejętnego ich uzywania tongue.gif

Eee tam, liczniki to nie wszystko tongue.gif Może nie miałes okazji ich przetestować laugh.gif

Takim plikom ja nie ufam. Ten plik będzie odpytywany co chwila, a jak rozmowa będzie żywiołowa to jeszcze częściej i będą konfikty z dostępem.
nospor
Ale to nie bedzie licznik. Tam bedzie zapisywana wartosc z bazy. Wartosc w pliku ma nie byc incrementowana a nadpisywana

Cytat
a jak rozmowa będzie żywiołowa to jeszcze częściej i będą konfikty z dostępem.
Jak pisalem, trzeba umiejetnie ich uzywac tongue.gif
Jak mnie jeszcze pownerwiasz to napisze taki czat i potestujem winksmiley.jpg

edit: w sumie to nie glupi pomysl. moze faktycznie napisze biggrin.gif
Athlan
Cytat
Jak mnie jeszcze pownerwiasz to napisze taki czat i potestujem

no to go denerwujemy: mÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓÓ tongue.gif

coś Ty sie tych plików tak czepił...
Cytat
Pozatym napisales, ze chcesz tam trzymasz ID ostatnio odebranej wiadomosci, a nie ID ostatnio dodanej. To troche inaczej niz mowilem. Co ci po ID ostatnio pobranej?

a po to, aby sprawdzić czy są nowsze smile.gif jeżeli są, wlepiamy je do DIV'a, jezeli nie... nic nie robimy. A jeżeli kolo napisze messagesa to go załapie, bo otrzyma kolejnego ID, czyli jego wiadomość zostanie zaliczona jako nowa smile.gif

pozdrawiam Nospor smile.gif... to pisz tego chata tongue.gif
nospor
Cytat
a po to, aby sprawdzić czy są nowsze jeżeli są, wlepiamy je do DIV'a, jezeli nie... nic nie robimy. A jeżeli kolo napisze messagesa to go załapie, bo otrzyma kolejnego ID, czyli jego wiadomość zostanie zaliczona jako nowa
no ale ID ostatnio pobranej to ja mowilem zeby trzymac w request. W pliku ma byc id ostanio dodanej. Jesli ty w pliku bedziesz mial ID ostatnio pobranej, to bedziesz musial leciec do bazy by sprawdzic jakie jest ID ostatnio dodanej.
Ale te pare postow to sie chyba poprostu nie do konco zrozumielismy i stad te zamieszanie winksmiley.jpg

Cytat
to pisz tego chata
coraz bardziej mnie korci... smile.gif
Od poniedzialku ide na urlop, to moze cos sklece. zobacze.
slowik
Myśle, że mógłby sie sprawdzic tutaj wzorzec Obserwatora. Reagować na dodanie wiadomości i dopiero wtedy odświeżać zawartość..

Pozdrawiam
Athlan
Po długich przemyśleniach stwierdzam, iż @nospor w swoim pierwszym poście ma całkowitą rację... aby nie obciążać bazy... jest sobie pliczek "~msg.tmp" i tam ID ostatnio dodanej wiadomości.

Jak zapisać wartość do pliku? ano tak, że jak dodajemy nową wiadomość, to zapisujemy sobie ID dodanej w pliczek - nieważne kto dodaje... i teraz pobieramy wszystkie wiadomości z bazy nowsze, bądź równe ID messagesa w pliku i zapisujemy sobie to ID do sesji dodatkowo... jeżeli w sesji jest równe jak w pliku to nie wysylamy zapytania o nowe wiadomości smile.gif

tak samo tyczy sie z userami... każdy user otrzymuje UID prz joinie (czyli ID wiadomości tak jakby)

nooo traz można cos robić smile.gif pozdrawiam all i powiedzieć co sądzicie o przeanalizowanym pomyśle smile.gif
bim2
No to jest calkiem niezłe, bazy nie zarznie a jesli plik padnie, to po chwili pewniektoś coś wyśle i wskoczy nowa wiadomośc smile.gif Zaraz przebuduje swojego shouta ;P
Athlan
teraz mam problem... przy 10 typa na chacie już są problemy (z wysyłaniem wiadomości)

ogólnie chacik sobie radzi, nie laguje wszystko dziala ok, ale jak robimy testy w 10 osób i wszyscy zaczynają pisać nagle byle co (żeby tylko dodać coś tongue.gif ) to plik po prostu pada smile.gif

i teraz pytanie jest następujące:

czy plik może być używany/nadpisywany przez kilku userów jednocześnie?

(przy szybkim wysyle jest używany przez kilku userów)
Cysiaczek
Operacje na plikach sa chyba kolejkowane. Masz takie coś jak flock() - blokada pliku.
Athlan
@Cysiaczek - chyba czy na pewno ? tongue.gif tutaj muszę być jednak pewien sad.gif
btw: uzywam file_put_contents()" title="Zobacz w manualu php" target="_manual

użytkownicy są pobierani nieco inaczej niż wiadomości... każdy ma swój plik w katalogu temp i lista userów jest zczytywana co 1 sec przez każdego usera... więc też czasem wywala z chata, bo co 1 sec jest zapisywany plik usera z aktualnym stanem, statusem itp.

po co pliki? a po to ze jak moderator zrobi /kick user to wywala mu plik i... połączenie przerwane, powód: (responseText) MOD CIE WYKOPAŁ smile.gif

i teraz jest konflikt z zczytywaniem plików i ich zapisem w tym samym momencie... da się jakoś to skolejkować (jak kolega powiedział) :?:
Cysiaczek
1. No widzisz - a ty ten plik usuwasz za każdym razem, czy modyfikujesz? To raczej ważne.
2. Przyznam się bez bicia, że nie wiem, co się dzieje, gdy skrypt trafi na zablokowany plik... hmm... halp halp halp blinksmiley.gif
Athlan
@Cysiaczek - plik jest co sekundę sprawdzany czy jest smile.gif jak jest to nadpisujemy go o aktualne dane, jak go nie ma to znaczy że modek nas wykopał i znikamy wszystkiz z listy zalogowanych NATYCHMIASTOWO!

dodatkowo jeżeli funckja filemtime" title="Zobacz w manualu php" target="_manual wskaże że nie edytowalismy pliczku przez 3 sec to znaczy że straciliśmy kontakt z serwem albo co... w każdym razie - timeout smile.gif

no i problem jest taki, że wszystkie pliki sa masowo uzywane.. czy mogą być? no i czy mogą dopisywać dwie osoby jednocześnie? lub czy jest jakiś inny sposób na tych userów?

---EDIT---

mimo poniższego skryptu który blokuje plik, problem niestety nadal wystepuje:
  1. <?php
  2. function file_put($n, $d)
  3. {
  4. $f = @fopen($n, "w+");
  5.  
  6. if(!$f)
  7. {
  8. return false;
  9. }
  10. else
  11. {
  12. if(flock($f, LOCK_EX))
  13. {
  14. fwrite($f, $d);
  15. flock($f, LOCK_UN);
  16. fclose($f);
  17. return true;
  18. }
  19. else
  20. {
  21. return false;
  22. }
  23. }
  24. }
  25. ?>


pozdrawiam smile.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.