Witam
Nie wiem czy to dobry dzial, troche mi to podchodzi pod dyskusje na wyzszym poziomie no ale jedziemy...
Tworze system czatu z wykorzystaniem PHP i AJAXu. Zastanawialem sie co wybrac do przechowywania danych no i mimo wszystko postawilem na baze danych. Wygodniej przechowywac, zapisywac, pobierac dane i oczywiscie utrzymac potrzebne relacje. Nie wyobrazam sobie tylko, ze X uzytkownikow przebywajacych na czacie wywoluje co 1 sekunde X zapytan do bazy danych bo to by bylo bez sensu. Zaznaczam, ze nie widzialem na oczy zadnego skryptu czatu i tak chce zeby pozostalo. Jak ktos sie na czyms wzoruje to nigdy nic dobrego nie powstaje, a ja chce stworzyc cos unikalnego.
Przedstawie wam jak ja to widze... Czat chce rozdzielic na 2 czesci:
- 1 modul, to dzialajacy z poziomu wiersza polecen program, ktory wlasnie co 1 sekunde pobiera najwazniejsze dane z bazy danych tj: liste kanalow, liste uzytkownikow na danym kanale oraz wiadomosci. Dla przykladu, realizujac mechanizm pobierania wiadomosci na danym kanale program zapamietuje ostatnia wiadomosc na danym kanale i tworzy plik sekwencji, ktory zapisuje w pliku tekstowym. Program pobiera z pliku tekstowego (wlasnie co 1 sekunde) wiadomosci zakolejkowane do dodania i jednym zapytaniem wysyla wszystko do pojemnika wiadomosci dla danego kanalu (do bazy danych) zmieniajac przy tym sekwencje. Przy wykrytej zmianie sekwencji, skrypt pobiera z bazy danych ostatnie 30 wiadomosci dla danego kanalu (reszte prawdopodobnie usuwa) i wrzuce je w plik cache na serwerze.
- 2 modul, to czyste PHP w polaczeniu z AJAXem dzialajacym po stronie klienta. Sekwencje wprowadzam po to, ze skrypt po stronie klienta wysyla co 1 sekunde zapytanie do skryptu PHP, ktory zwraca mu z piku tekstowego zawartosc unikalnej sekwencji. Skrypt zapamietuje ostatnia sekwencje i przy kazdym pobraniu ja porownuje z poprzednia. Dzieki temu skrypt wie, czy dokonano jakiejs zmiany w pojemniku wiadomosci dla danego kanalu czy tez nie. Jezeli wykryto zmiane sekwencji, to skrypt pobiera z pliku cache liste ostatnich wiadomosci i je wyswietla i zwraca ja do klienta.
To mechanizm wysylania wiadomosci ogolnych dla kanalu. Analogicznie chce zrobic wiadomosci prywatne, z troche wieksza liczba zaleznosci, oraz liste aktywnych uzytkownikow. Troche zagmatwane, ale wydaje mi sie bardziej racjonalne, niz mozliwosc wysylania przez np. 500 uzytkownikow 1000 zapytan do bazy danych co sekunde. W moim rozwiazaniu zapytania sa pobierane tylko raz przez program dzialajacy w tle i cachowane do plikow. Oczywiscie bede musial pomyslec nad mechanizmem kontroli dostepu do plikow tekstowych, zebym nie nadpisywal ani nie usuwal nieprzetworzonych plikow.
Problem jest z dostepnoscia uzytkownikow. Myslalem nad tym, zeby uzytkownik w jakis sposob 'pingowal' skrypt dzialajacy w tle, a w przypadku nieotrzymania 'pinga' przez np. 15 sekund program laczylby sie z baza danych i usuwal uzytkownika z listy. Tu tez raczej nie moge zrobic updateu rekordu uzytkownika co np. 5 sekund bo na wieksza skale zapcham baze danych.
Oczywiscie prosze o wszystkie sugestie. Jak moj pomysl ma sie do wydajnosci, moze macie jakiejs lepsze pomysly - chetnie wyslucham.