Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> live chat i websocket, wydajny chat
bialko0019
post
Post #1





Grupa: Zarejestrowani
Postów: 294
Pomógł: 4
Dołączył: 19.12.2008

Ostrzeżenie: (0%)
-----


Witam. CHciałbym stworzyć w miare wydajny ( zakładam około 5tyś userów dziennie, z czego np. 1/4 będzie używała wiadomości w danym dniu ) i chciałbym zrobić chat dla nich. Jak myślicie, serwer wytrzyma połączenie typu ajax i php, gdzie intervalem lacze sie co kilka sekund, i sprawdzam czy jest nowy id, jeśli tak to pobieram wiadomość nową? Jeśli raczej nie ma szans, to jak z kompatybilnością i obsługą jest z websocket? Słyszałem o nim, że o wiele łatwiej, jeśli chodzi o wydajność, ale serwis ma być też responsywny a więc i mobilne przeglądarki mogą różnie to interpretować. Jest sposób na obejście websocketa ( nie wiem z czym się go je itd, a czas mnie trochę goni... )
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Skie
post
Post #2





Grupa: Zarejestrowani
Postów: 555
Pomógł: 84
Dołączył: 20.02.2008
Skąd: Małopolska

Ostrzeżenie: (0%)
-----


Widzę, że wolisz rozwiązanie PHP i odniosłeś sie w swoim poście do linka, który podałem , więc wytłumaczę Ci wszystko wg. działania Ratchet. Server.php to plik, który uruchamiasz na serwerze za pomocą komendy z konsoli serwera - np. przez putty.

  1. php server.php


Powinien on w nieskończonej pętli czekać na przychodzące wiadomości socketowe i w momencie otrzymia takiej wiadomości odpalać odpowiednią funkcję. Oczekiwanie, wyłączenie timeoutów PHP i całą warstwę odpowiedzialną za demonizację procesu PHP odpowiada moduł React/Loop, którego Ratchet używa, więc tutaj nie musisz się przejmować o tego typu problemami - tj. "wygasaniem" PHP.

Wspomniany serwer musi implementować 4 podstawowe funkcje - onStart, onStop, onMessage i onError - pierwsza uruchamiana jest w przypadku utworzenia nowego połączenia, druga w przypadku zamknięcia istniejącego, trzecia w przypadku otrzymania wiadomości i czwarta w przypadku błędu. Najważniejsza jest trzecia
  1. onMessage(ConnectionInterface $conn, MessageInterface $message)
. Funkcja ta ma podobne zadanie jak routing HTTP w przypadku frameworków MVC - odbierasz wiadomość $message od użytkownika $conn i następnie ją parsujesz i przkazujesz do odpowiedniego kontrolera w aplikacji. Odpowiedź generujesz za pomocą $conn->send(MessageInterface $response).

Dla porównania w MVC routing zrobiłbyś mniej więcej tak:
  1. Router::setController('/hello', new HelloWorldController());


Odpowiednik tego przy weboscket (ratchet) byłby taki:
  1. onMessage(ConnectionInterface $conn, MessageInterface $message) {
  2. switch ($message['get']) {
  3. case '/hello':
  4. $controller = new HelloWorldController();
  5. break;
  6.  
  7. /* ... */
  8. }
  9.  
  10. $conn->send(
  11. $controller->someAction($message)
  12. );
  13. }


Oczywiście możesz tutaj jaki syntax-sugar samemu zrobić by zapis byłby prostszy i np tworzyć nowe routingi za pomocą czeogś w stylu:
  1. Websocket::setController('/hello', new HelloWorldController());


To wszystko - łatwo, prosto i przyjemnie.

W tym momencie widzisz, że HTTP i WebSocket to osobne wejścia do Twojej aplikacji, ale jestes w stanie połączyć je obie z istniejącą już architekturą. Problemem jaki możesz napotkać to obiekt $Request, który może w tym przypadku nie istnieć wewnąrz aplikacji, która normalnie używa HTTP. Jeśli moduły z których chcesz skorzystać używają aktywnie Request i nie znajdziesz sposobu by zamockować go przy websocket, to możesz rozwiązać ten problem w taki sposób, by serwer.php po otrzymaniu wiadomości socket, wysyłał lokalnie zapytanie HTTP do Twojej aplikacji , czekał na odpowiedź i następnie odsyłał wiadomość przez socket. Postaraj sie jednak użyć tego w ostateczności.

W kwestii zarządcy, to problem jest taki - PHP domyślnie jest jednowątkowe - to oznacza, że jakikolwiek Fatal Error lub Unhandled Exception zamknie proces server.php , a co za tym idzie, Twoje webosckety przestaną działać. Rolą zarządcy jest monitorowanie danego procesu - tutaj server.php z poziomu systemu operacyjnego - po to, że jeślli zakończy on działanie, zarządca uruchomi go ponownie. Dzięki temu niebędziesz musiał się bać, że w przypadku wysypania się któregoś modułu Twoja aplikacja przestanie działac.

UWAGA:
Nie przepisuj kodu PHP, który podałem w tym poście słowo w słowo, gdyż jest to pseudokod pisany z pamięci, by dać Ci ogólne pojęcia jak to ustrukturyzować. Dokładne zapisy weź z manuala Ratchet.

Ten post edytował Skie 20.08.2015, 01:39:09
Go to the top of the page
+Quote Post

Posty w temacie
- bialko0019   live chat i websocket, wydajny chat   10.08.2015, 19:59:04
- - grzes999   Nie testowałem socketów nigdy na urządzeniach mobi...   10.08.2015, 20:13:46
- - bialko0019   hmm, tylko websocket dla mnie nie jest jeszcze pro...   10.08.2015, 20:24:13
- - Skie   Napisanie chatu w oparciu o WebSockety to dużo łat...   10.08.2015, 20:54:29
- - by_ikar   Stwórz coś z przykładów, zarówno w php jak i w nod...   11.08.2015, 07:38:25
- - pyro   Wsparcie websocketów przez przeglądarki: http://ca...   11.08.2015, 11:07:10
- - bialko0019   Witam ponownie. Dzieki za odpowiedzi. mam pytanie....   18.08.2015, 10:50:34
|- - grzes999   Cytat(bialko0019 @ 18.08.2015, 11:50...   18.08.2015, 12:23:19
- - Comandeer   Ta klasa nie ma być uruchamiana na serwerze, tylko...   18.08.2015, 11:21:43
- - bialko0019   czyli plik typu "server.php" jest w tle ...   18.08.2015, 12:06:08
- - bialko0019   Chciałbym osiągnąć to, że w serwisie jest np. 100 ...   18.08.2015, 12:31:08
|- - grzes999   Cytat(bialko0019 @ 18.08.2015, 13:31...   18.08.2015, 12:36:51
- - bialko0019   czyli myślisz, że serwer może nie dać rady przy aj...   18.08.2015, 14:04:41
- - !*!   https://github.com/Flynsarmy/PHPWebSocket-C...ster...   18.08.2015, 14:15:05
- - bialko0019   acha, ok dziękuję, będę to rozkminiać ;-) Jako, ż...   19.08.2015, 21:29:11
- - Comandeer   Jak nie możesz tego odpalić w konsoli serwera, to ...   20.08.2015, 00:11:48
- - Skie   Widzę, że wolisz rozwiązanie PHP i odniosłeś sie w...   20.08.2015, 01:37:04
- - grzes999   Mogę ci jeszcze podpowiedzieć, że w przypadku taki...   20.08.2015, 08:13:46


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 6.10.2025 - 10:03