![]() |
![]() ![]() |
![]() |
![]()
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... )
-------------------- ---
"kto pyta ten nie błądzi"... |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 305 Pomógł: 29 Dołączył: 5.07.2011 Ostrzeżenie: (0%) ![]() ![]() |
Nie testowałem socketów nigdy na urządzeniach mobilnych; ale wydaje mi się, że nie powinno być z tym problemu, AJAX w tym przypadku nie ma sensu, jedyne służne rozwiażanie to użycie socketów, w google jest masa przykładów chata z wykorzystaniem socketów, możeszesz również skorzystać z tego przy pracy z socketami: WebSockets for PHP
|
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 294 Pomógł: 4 Dołączył: 19.12.2008 Ostrzeżenie: (0%) ![]() ![]() |
hmm, tylko websocket dla mnie nie jest jeszcze prostym rozwiązaniem, no ale okey, jeśli nie ma innego wyjścia to trudno.. ;-P
-------------------- ---
"kto pyta ten nie błądzi"... |
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 555 Pomógł: 84 Dołączył: 20.02.2008 Skąd: Małopolska Ostrzeżenie: (0%) ![]() ![]() |
Napisanie chatu w oparciu o WebSockety to dużo łatwiejszy sposób rozwiązania tego problemu niż bawienie się w polling lub long-polling w oparciu o AJAX. Również polecam Ci bibliotekę Ratchet, którą podlinkował @grzes999 - jest tam nawet Tutorial pisania chatu w oparciu o nią - czyli dokładnie to co potrzebujesz oraz rozwiązania typowych problemów, które możesz napotkać przy zdemonizowaniu procesu PHP.
Sama biblioteka w najniższych warstwach wspiera wiele różnych protokołów WebSocket używanych na przestrzeni lat przez przeglądarki, więć jeśli chodzi o komaptybilność to nie powinno być żadnych problemów. Jeśli chodzi o samą wydajność to autor podaje mozliwość przetwrzania 1.000 wiadomości na sekundę, ale nie jest to twarda granica. Użytkownikom w grupie dyskusyjnej tej technologii udawało się uzyskać nawet 4 tys. wiadomości. Myślę, że korzystajać z PHP7 i dobrym serwerze dałoby się spokojnie uzyskać 10 tys. W sieci jest dużo benchmarków porównujących Ratchet vs Nodejs, możesz tam znaleźć więcej informacji. -------------------- Wieloprocesowość i wielowątkowość w PHP, poznaj Kraken PHP!
Serwer HTTP i WebSocket w PHP | Promise/A+ Strona Domowa | Elradia MMORPG FireFox: make the web better. |
|
|
![]()
Post
#5
|
|
![]() Grupa: Zarejestrowani Postów: 1 798 Pomógł: 307 Dołączył: 13.05.2009 Skąd: Gubin/Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Stwórz coś z przykładów, zarówno w php jak i w node.js a potem użyj websocket-benchmark do przetestowania tego. Nigdy nie robiłem tego z użyciem php, zawsze bałem się ilości pamięci jaką php pochłonie..
|
|
|
![]()
Post
#6
|
|
![]() Grupa: Zarejestrowani Postów: 2 148 Pomógł: 230 Dołączył: 26.03.2008 Ostrzeżenie: (0%) ![]() ![]() |
Wsparcie websocketów przez przeglądarki: http://caniuse.com/#feat=websockets
Websockety > AJAX Zamiast Ratcheta czy innych tego bibliotek lepiej użyć do tego node.js, jeśli masz taką możliwość -------------------- ET LINGUA EIUS LOQUETUR IUDICIUM
|
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 294 Pomógł: 4 Dołączył: 19.12.2008 Ostrzeżenie: (0%) ![]() ![]() |
Witam ponownie. Dzieki za odpowiedzi. mam pytanie. Próbuję rozkminić websocket, ale nie do końca rozumiem idei i tym samym rozkminic,
Pobrałem klasę z https://github.com/Flynsarmy/PHPWebSocket-Chat , uruchomiłem na serwerze ( <?php exec('php server.php'); ?> ) i wszystko hula, tylko jak teraz zabić ten proces ? I czy muszę go raz na jakiś czas uruchamiać? Jak on obciąża serwer? ( nie localhost na xampp tylko już docelowym ) I moja najwieksza prośba o wyjaśnienie. Na jakiej zasadzie działa to, że user jest przydzielany tutaj i widzi wiadomości? Są w jakimś cache? Chcę zrobić tak, że ten chat jest dostępny tylko dla zalogowanych i tylko dla dwóch userów pomiędzy sobą, a wiadomości się zapisują w bazie? Gdzie moge szukać odpowiedzi? Różne IP dla różnych userów? A jak to rozkminić dla aktualnie zalogowanego do cms`a ? -------------------- ---
"kto pyta ten nie błądzi"... |
|
|
![]()
Post
#8
|
|
![]() Grupa: Zarejestrowani Postów: 1 268 Pomógł: 254 Dołączył: 11.06.2009 Skąd: Świętochłowice Ostrzeżenie: (0%) ![]() ![]() |
Ta klasa nie ma być uruchamiana na serwerze, tylko uruchamiana jako serwer (PHP jako demon) - stąd polecono Ci node.js jako lepiej radzący sobie w takim przypadku i wręcz jakby stworzony dla websockets. + ma lepsze community od tych rzeczy (wystarczy wpisać w google socket.io i dostaniemy wszystko, co tylko chcemy o socketach na tej bibliotece, łącznie z tysiącem przykładów czatów
![]() Tak na oko to tutaj po prostu każdy, kto się połączy, widzi wszystko. Jak potrzebujesz jakiejś autoryzacji userów, to trza by ją zrobić osobno i wówczas np wiązać połączenia z jednego browsera (w końcu każda karta = inne połączenie) z konkretną sesją usera. -------------------- ★Mój blog || Okiem krytyka★
|
|
|
![]()
Post
#9
|
|
![]() Grupa: Zarejestrowani Postów: 294 Pomógł: 4 Dołączył: 19.12.2008 Ostrzeżenie: (0%) ![]() ![]() |
czyli plik typu "server.php" jest w tle uruchamiany i z każdym żadaniem ( wysłanie , odbieranie ) jest wykonywany? Coś jak by ajaxowy chat, gdzie ten plik jest odświeżany cyklicznie?
-------------------- ---
"kto pyta ten nie błądzi"... |
|
|
![]()
Post
#10
|
|
Grupa: Zarejestrowani Postów: 305 Pomógł: 29 Dołączył: 5.07.2011 Ostrzeżenie: (0%) ![]() ![]() |
I moja najwieksza prośba o wyjaśnienie. Na jakiej zasadzie działa to, że user jest przydzielany tutaj i widzi wiadomości? Są w jakimś cache? Chcę zrobić tak, że ten chat jest dostępny tylko dla zalogowanych i tylko dla dwóch userów pomiędzy sobą, a wiadomości się zapisują w bazie? Gdzie moge szukać odpowiedzi? Różne IP dla różnych userów? A jak to rozkminić dla aktualnie zalogowanego do cms`a ? Nie do końca rozumiem co chcesz osiągnąć, na chacie jednocześnie może przebywać wyłącznie dwie osoby? Czy chcesz zrobić coś w stylu chatów z supportem jest użytkownik z rolą admin i do niego podłączają się klienci? Witam ponownie. Dzieki za odpowiedzi. mam pytanie. Próbuję rozkminić websocket, ale nie do końca rozumiem idei i tym samym rozkminic, Pobrałem klasę z https://github.com/Flynsarmy/PHPWebSocket-Chat , uruchomiłem na serwerze ( <?php exec('php server.php'); ?> ) i wszystko hula, tylko jak teraz zabić ten proces ? I czy muszę go raz na jakiś czas uruchamiać? Jak on obciąża serwer? ( nie localhost na xampp tylko już docelowym ) Tak jak ci Comandeer napisał, uruchamiasz to jako serwer do tego typu rzeczy dobrze mieć jakiegoś zarządce, ja polecam supervisord czyli plik typu "server.php" jest w tle uruchamiany i z każdym żadaniem ( wysłanie , odbieranie ) jest wykonywany? Coś jak by ajaxowy chat, gdzie ten plik jest odświeżany cyklicznie? Ten plik jest twoim serwerem i nasłuchuje na podanym porcie czy jest jakieś połączenie bądź przyszła jakaś wiadomość, tak bardzo w skrócie i może mało technicznie; ale ma nadzieję że łapiesz o co chodzi Ten post edytował grzes999 18.08.2015, 12:30:55 |
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 294 Pomógł: 4 Dołączył: 19.12.2008 Ostrzeżenie: (0%) ![]() ![]() |
Chciałbym osiągnąć to, że w serwisie jest np. 100 userów. Każdy może kliknąć "wyslij wiadomość" do usera i może z nim porozmawiać. Taka wewnętrzna skrzynka wiadomości jeden do jednego ;-) Rozwiązałem to ajax`em, ale boję się, że np. przy 100 userach jednoczescie rozmawiających może serwer nie wytrzymać.. ;-) Myślę, że setka osób to byłby max na początek, chyba że ajax pojdzie?
-------------------- ---
"kto pyta ten nie błądzi"... |
|
|
![]()
Post
#12
|
|
Grupa: Zarejestrowani Postów: 305 Pomógł: 29 Dołączył: 5.07.2011 Ostrzeżenie: (0%) ![]() ![]() |
Chciałbym osiągnąć to, że w serwisie jest np. 100 userów. Każdy może kliknąć "wyslij wiadomość" do usera i może z nim porozmawiać. Taka wewnętrzna skrzynka wiadomości jeden do jednego ;-) Rozwiązałem to ajax`em, ale boję się, że np. przy 100 userach jednoczescie rozmawiających może serwer nie wytrzymać.. ;-) Myślę, że setka osób to byłby max na początek, chyba że ajax pojdzie? Jeżeli rozwiązałeś to ajaxem to po prostu przenieś to na skrypt server.php i gotowe. Pomyśl, że masz 20 userów rozmawiających ze sobą to jest ok.1200 requestów na minutę + zapis, odczyt z bazy wiadomości; ale twój wybór |
|
|
![]()
Post
#13
|
|
![]() Grupa: Zarejestrowani Postów: 294 Pomógł: 4 Dołączył: 19.12.2008 Ostrzeżenie: (0%) ![]() ![]() |
czyli myślisz, że serwer może nie dać rady przy ajax`owym requescie co 5sekund? ;-)
Kolega wyżej napisał "Ten plik jest twoim serwerem i nasłuchuje na podanym porcie czy jest jakieś połączenie bądź przyszła jakaś wiadomość" - czyli jaką funkcją mogę sprawdzić, czy ktoś coś wysłał z formularza? -------------------- ---
"kto pyta ten nie błądzi"... |
|
|
![]()
Post
#14
|
|
Grupa: Zarejestrowani Postów: 4 298 Pomógł: 447 Dołączył: 16.11.2006 Ostrzeżenie: (0%) ![]() ![]() |
https://github.com/Flynsarmy/PHPWebSocket-C...ster/server.php
Masz tam funkcje wsOnMessage która wysyła wiadomość do wszystkich prócz siebie, wykorzystuje to metodę wsSend z https://github.com/Flynsarmy/PHPWebSocket-C...HPWebSocket.php Możesz to rozbić, i np po stronie JS (w zasadzie musisz), wysłać do serwera informacje że ma iść prywatna wiadomość "pm.ID.txt" wtedy serwer sam to rozkmini na wejściu i zamiast wysyłać do wszystkich wyśle do osoby o id do jakiej chciałeś, Ten post edytował !*! 18.08.2015, 14:44:41 -------------------- Nie udzielam pomocy poprzez PW i nie mam GG.
Niektóre języki programowania, na przykład C# są znane z niezwykłej przenośności (kompatybilność ze wszystkimi wersjami Visty jest wiele warta). |
|
|
![]()
Post
#15
|
|
![]() Grupa: Zarejestrowani Postów: 294 Pomógł: 4 Dołączył: 19.12.2008 Ostrzeżenie: (0%) ![]() ![]() |
acha, ok dziękuję, będę to rozkminiać ;-)
Jako, że nie znam node.js w ogóle, to dużo czasu mi zejdzie na początek, by go załapać. Dowiedziałem się, że node`a trzeba zainstalować na serwerze, a niestety nie mam dostępu do dedyka, więc chyba ta opcja odpada. A więc jedynym rozwiązaniem jest zrobienie pliku typu "serwer.php" , który nasłuchiwał by czy dla danego użytkownika jest jakaś nowa wiadomość i wtedy ewentualnie wysyłał info do pliku, w którym się czyta wiadomości i je aktualizował tylko wtedy? Nie rozumiem jeszcze jednej rzeczy. Ten plik "serwer.php" żeby nasłuchiwał, to trzeba go uruchomić np. tak jak napisałęm, coś typu exec('php -q serwer.php'); a co właśnie potem, bo samo uruchomienie tego pliku wygasa? Kolega napisał, że najlepiej mieć "zarządce" ? Co to znaczy? Uruchomienie tego pliku czyli nasłuchiwanie portu po jakimś czasie wygasa, jak to zautomtyzować? I tak się jeszcze dopytam - może znacie jakąś inną wydajniejszą opcję jak odpytywanie, ale mniej skomplikowaną i nie wymagającą dedyka jak node.js i socket.io ? Jeśli nie to może zrobić dłuższy interval dla odpytywania np. 8sekund w ajax... Ten post edytował bialko0019 19.08.2015, 23:46:03 -------------------- ---
"kto pyta ten nie błądzi"... |
|
|
![]()
Post
#16
|
|
![]() Grupa: Zarejestrowani Postów: 1 268 Pomógł: 254 Dołączył: 11.06.2009 Skąd: Świętochłowice Ostrzeżenie: (0%) ![]() ![]() |
Jak nie możesz tego odpalić w konsoli serwera, to nie ma sensu się w to bawić. Z poziomu strony to nie ma prawa działać.
Nie potrafisz zrozumieć, że ten plik PHP nie ma być serwowany z serwera, tylko sam służyć jako serwer. Ma działać podobnie do Apache'a - odpowiadać na żądania HTTP. W takim wypadku zostaje comet aka long polling. Polecam poczytać w tym zakresie o Server-Sent Events -------------------- ★Mój blog || Okiem krytyka★
|
|
|
![]()
Post
#17
|
|
![]() 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.
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 . 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:
Odpowiednik tego przy weboscket (ratchet) byłby taki:
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:
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 -------------------- Wieloprocesowość i wielowątkowość w PHP, poznaj Kraken PHP!
Serwer HTTP i WebSocket w PHP | Promise/A+ Strona Domowa | Elradia MMORPG FireFox: make the web better. |
|
|
![]()
Post
#18
|
|
Grupa: Zarejestrowani Postów: 305 Pomógł: 29 Dołączył: 5.07.2011 Ostrzeżenie: (0%) ![]() ![]() |
Mogę ci jeszcze podpowiedzieć, że w przypadku takich skryptów warto rejestrować wszelkie błędy oraz fatale register_shutdown_function
|
|
|
![]() ![]() |
![]() |
Aktualny czas: 20.08.2025 - 21:12 |