Prywatne wiadomości jak na Facebooku na socketach

0

Dzień dobry,
Robię sobie na stronie pisanie prywatnych wiadomości między użytkownikami tak jak na Facebooku - w tych okienkach na dole ekranu i chciałbym poradzić się Was w kwestii technicznej. Odświeżanie AJAX-em co kilka sekund i pobieranie nowych wiadomości zarżnie mi serwer przy większej użytkowników online, dlatego postanowiłem spróbować z Socketami i to właśnie o nie chciałbym zapytać.
Stronę mam we frameworku Kohana, ale do obsługi socketów na serwerze (server.php) nie wpakuję całego framework'a (tzn. chyba nie opłaca się tego robić jako kontroler frameworka i zaciągać przy tym wszystkie pliki framework'a bo pewnie będą jakieś dodatkowe problemy z wydajnością). Wiadomości chce zapisywać w bazie danych, a że nie zaciągam frameworka tutaj w server.php to zrobię to w czystym php+pdo+ręczna walidacja danych bez gotowych metod z frameworka [jeśli tu macie jakieś uwagi to dodatkowo będę wdzięczny za oświecenie/poprawienie mnie ;)]. Ale moje pytanie jest takie, czy w tym pliku server.php obsługującym sockety, lepiej otworzyć połączenie stałe z bazą danych i nie zamykać go w ogóle czy tylko otwierać i zamykać przy zapisywaniu wiadomości do bazy danych?
Będę wdzięczny za wskazówki.

0

dużo się różni Kohan od Codeignitera? może na ajaxie+php z jakimś cache nie byłoby tragedii, chyba, że faktycznie przewidujesz bóg wie jaki ruch, tak do "domowego" zastosowania raczej starczy

0

A nie wiem czy wiele różnią się te frameworki, nie kombinowałem nigdy z Codeigniterem. Strona będzie przeznaczona dla kilku(nastu) tysięcy użytkowników online w tym samym czasie więc AJAX zamiesza chyba mocno przy takiej ilości użytkowników :)
Długi post napisałem, ale główne pytanie, które mnie interesuje to czy lepiej raz otworzyć połączenie z bazą danych w pliku server.php (obsługujący sockety) i nie zamykać go (zamknie się po wyłączeniu wykonywania tego pliku lub jak padnie serwer xd) czy ta druga opcja czyli 1. połączenie z bazą, 2. insert do bazy, 3. zamkniecie polaczenia z baza - tylko to chyba też niezbyt wydajne rozwiązanie jak będą pisać ludzie w tym samym momencie troche wiadomosci?
Pierwsze opcja wydaje się wydajniejsza, ale nie wiem czy coś może się nie "wykrzaczyć" gdy to połączenie będzie tak otwarte przez cały czas.

0

socketów na php nie zrobisz musisz mieć serwer który stale jest uruchomiony a php jest bezstanowe. Nie wiem jak to co używasz, ale w laravel ma bardzo fajny mechanizm do webscoektów, dokładnie wysyła dane do redisa a działający obok server oparty o node.js odbiera te dane i rozsyła do userów po websocketach.

0

@mr_jaro: korzystam z tego https://github.com/johnnymast/mysql_websocket_chat
Działają mi sockety bo odpaliłem sobie tą paczkę na lokalnym i coś tam działa, połączenie socket jest nawiązane, a plik server.php uruchamiam w konsoli poprzez "php server.php" i ten plik chyba cały czas działa - być może jest jakaś pętla while i na tym to polega. W konsoli wygląda to tak jakby ten plik cały czas się wykonywał i nie zostało zakończone jego wykonywanie.

0

jest to obejście, ale słabe, php nie jest zrobiony i przystosowany do takich celów, możesz mieć wycieki pamięci no i oczywiście nie bedzie to ta wydajność co korzystając z node.js

0

@mr_jaro: dzięki, ponownie dziś zmieniłem zdanie i wziąłem się za Node.js :) Znalazłem w necie jakiś przykład live chat w Node, trochę go przerobiłem - dodałem zabezpieczenie z wykorzystaniem nagłówka Origin (walidacja hosta) i zapisywanie wiadomości do bazy MySQL. Prosiłbym o sprawdzenie przez kogoś na szybko kodu pod względem bezpieczeństwa - głównie nie podoba mi się to, że wrażliwe dane logowania do bazy danych są podane w pliku .js (server.js) i obawiam się dostępu do tego przez kogoś - np. z przeglądarki. Prosiłbym o zweryfikowanie i ewentualnie wskazówki.
Tutaj wrzuciłem najważniejszy kod:
plik server.js - http://pastebin.pl/view/2ce33296
plik frontend.js (ładowany na stronie w htmlu) - http://pastebin.pl/view/78485536

Połączenia z bazą danych nie muszę nigdzie zamykać[poprzez db_connection.end() ] ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1