Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Chat, websocket - logika działania aplikacji
Forum PHP.pl > Forum > PHP
zielq701
Witam wszystkich,
chcę stworzyć aplikację, coś ala chat z facebooka. Nasunęło mi się kilka pytań i liczę na Waszą pomoc. Chce działać w oparciu o Ratchet (server WS w php), a więc do rzeczy.

1) Logowanie do chatu.
- osoba która loguje się do chatu, przesyła przez WS swoje dane do logowania,
- server sprawdza, czy dane są poprawne,
- jeżeli są, dodaje token do bazy danych (dowiązuje go do aktywnego połączenia) i wysyła użytkownikowi. Javascript odczytuje token i zachowuje w zmiennej.

Jest jeszcze możliwość użycia sesji. "Important: Sessions through WebSockets work as they do through a traditional webserver; a cookie is set and transmitted in each request header. This means that your website and your WebSocket server both must have access to the cookie.".

Nie wiem czy dobrze rozumiem, czy nagłówki wysyłane są przy każdej wiadomości? Czy rozwiązanie które zaproponowałem jest poprawne (pod względem bezpieczeństwa i prędkości działania aplikacji), czy jednak powinienem użyć sesji, lub całkowicie czegoś innego?

2) Wysyłanie wiadomości (JSON).
Gdy użytkownik przeszedł autoryzację, może wysyłać wiadomości, w których przekazywany jest token oraz id usera do którego ma dojść wiadomość (id zapisane w bazie danych, ponieważ można wysyłać wiadomości do osób, które nie są zalogowane).
- server sprawdza czy token jest powiązany z aktywnym połączeniem, które ten token otrzymało (łączy się z baza danych, i sprawdza czy wpis istnieje),
- jeżeli tak, to wysyła wiadomość oraz zapisuje ją w bazie, jeżeli nie zwraca błąd.

3) Konferencje lub chat roomy.
- Użytkownik wysyła id konferencji lub chatroomu w wiadomości do servera,
- server sprawdza id konferencji w bazie danych i wysyła wiadomość do przypisanych użytkowników.

To jest mój jedyny pomysł jak mogłoby to wyglądać, czy tak będzie dobrze?

4) Kto jest online.
Osoba która się dołącza, dodawana jest do bazy, a zaktualizowany status wysyłany do już zalogowanych.
Ktoś, kto się łączy pobiera z bazy osoby online.
Przy rozłączaniu wpis z bazy jest kasowany (czy może jednak lepiej przechowywać wpisy i tylko je aktualizować?), a do osób na chacie wysyłany jest zaktualizowany status użytkownika.

Proszę o podpowiedzi co do logiki działania takiej aplikacji. Po Waszej weryfikacji, zacznę od zaprojektowania bazy danych i wstawię tutaj jakiś szkic do sprawdzenia.

Z góry wielkie dzięki za pomoc smile.gif.
by_ikar
Kod
Jest jeszcze możliwość użycia sesji. "Important: Sessions through WebSockets work as they do through a traditional webserver; a cookie is set and transmitted in each request header. This means that your website and your WebSocket server both must have access to the cookie.".


W websoketach jest coś takiego jak handshake, który się wykonuje co jakiś czas aby sprawdzić stan połączenia, jak i również ustanowić połączenie.

Nie przesyłaj całych danych za każdym razem, użyj sesji, przesyłaj tylko niezbędne minimum danych, bo jak będziesz się opierać na danych które przesyła ci użytkownik, to będziesz musiał je dodatkowo sprawdzać, a potem i tak porównywać ze "swoimi" danymi, więc to jest niepotrzebne. Wiadomość, do kogo ma zostać wysłana wiadomość oraz sama sesja to jest maks co powinieneś tam mieć.

Kod
Nie wiem czy dobrze rozumiem, czy nagłówki wysyłane są przy każdej wiadomości? Czy rozwiązanie które zaproponowałem jest poprawne (pod względem bezpieczeństwa i prędkości działania aplikacji), czy jednak powinienem użyć sesji, lub całkowicie czegoś innego?


Tak, nagłówki są wysyłane z każdą wiadomością/handshakiem. Pod względem bezpieczeństwa względnie, pod względem prędkości działania aplikacji? Cóż, podsumujmy to:
- chcesz odpalić stałe połączenia w php, nie da się tego inaczej zrobić, puszczając dany request w wieczną pętlę;
- 20 takich połączeń, to 20 procesów ciągle oczekujące na dane;
- do tego dochodzą handshaki, coś w rodzaju subrequestów;

nie, nie będzie to wcale wydajne. Będzie to w miarę dobre rozwiązanie dla niedużego ruchu, przy większym ruchu, zaczniesz mieć problemy wydajnościowe i samo optymalizowanie aplikacji niewiele ci pomoże, dlatego że php nie do tego został zaprojektowany.

node.js + socket.io + redis + espress (+sesje z expressa). Z poziomu php będziesz miał dostęp do sesji w redisie; same wiadomości możesz najpierw trzymać w redisie i dopiero w tle wrzucać je do mysqla, czy innej bazy.
zielq701
Cytat(by_ikar @ 29.11.2014, 17:26:45 ) *
- 20 takich połączeń, to 20 procesów ciągle oczekujące na dane;


hmmm, utworzyłem 200 połączeń, a to jest zużycie procesora


Przy 600 połączeniach zużycie tez ledwo drgnęło.

Korzystam z gotowego rozwiązania serwera WS http://socketo.me/docs/design . Powinienem zmienić na node.js?
by_ikar
200 stałych połączeń, czy 200 requestów? Czym utworzyłeś te 200 połączeń? Screen niewiele mi mówi, wywnioskować z niego mogę tylko tyle że putty zmienia czcionkę dla wytłuszczonego tekstu (zmień to w ustawieniach colours na kolor albo "oba").

Co do tego czy powinieneś zmienić czy nie, wszystko zależy od twoich potrzeb. Same połączenia to też nie jest wszystko, dodaj do tego emity, zapisywanie do bazy, odczytywanie z niej etc. Wszystko zależy od tego do czego aspiruje twój projekt.
zielq701
Poczytałem troche i skorzystam z rozwiązania, które zaproponowałeś. Dzięki za pomoc 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.