Myślałem o wdrożeniu czatu w czasie rzeczywistym przy użyciu zaplecza PHP, ale natknąłem się na ten komentarz na stronie omawiającej kometę:
Rozumiem, że PHP jest okropnym językiem dla Comet, ponieważ Comet wymaga utrzymywania stałego połączenia otwartego z każdym klientem przeglądarki. Używając mod_php oznacza to wiązanie dziecka Apache w pełnym wymiarze czasu dla każdego klienta, który w ogóle nie jest skalowany. Ludzie, których znam, robiąc rzeczy z Comet, głównie używają Twisted Pythona, który jest zaprojektowany do obsługi setek lub tysięcy jednoczesnych połączeń.
Czy to prawda? A może jest to coś, co można skonfigurować?
Odpowiedzi:
Zgadzając się / rozszerzając to, co już zostało powiedziane, nie sądzę, że FastCGI rozwiąże problem.
Apache
Każde żądanie do Apache będzie używać jednego wątku roboczego do zakończenia żądania, co może być długim czasem w przypadku żądań COMET.
Ten artykuł o Ajaxian wspomina o używaniu COMET na Apache i że jest to trudne. Problem nie jest specyficzny dla PHP i dotyczy każdego modułu CGI zaplecza, którego możesz chcieć użyć na Apache.
Sugerowanym rozwiązaniem było użycie modułu MPM „zdarzenia”, który zmienia sposób wysyłania żądań do wątków roboczych.
Niestety to też nie działa, ponieważ „drzemie” dopiero po zakończeniu żądania, czekając na nowe żądanie od klienta.
PHP
Teraz, biorąc pod uwagę drugą stronę problemu, nawet jeśli rozwiążesz problem z zatrzymywaniem jednego wątku na żądanie komety, nadal będziesz potrzebować jednego wątku PHP na żądanie - dlatego FastCGI nie pomoże.
Potrzebujesz czegoś takiego jak Kontynuacje, które pozwolą na wznowienie żądań komety, gdy zostanie zaobserwowane zdarzenie, przez które zostały wyzwolone. AFAIK, to nie jest coś, co jest możliwe w PHP. Widziałem to tylko w Javie - zobacz serwer Apache Tomcat .
Edytować:
Jest tutaj artykuł o używaniu load balancera ( HAProxy ), który pozwala na uruchomienie zarówno serwera Apache, jak i serwera obsługującego kometę (np. Jetty, tomcat dla Java) na porcie 80 tego samego serwera.
źródło
Możesz użyć Nginx i JavaScript, aby zaimplementować system czatu oparty na Comet, który jest bardzo skalowalny przy niewielkim wykorzystaniu pamięci lub procesora.
Mam tutaj bardzo prosty przykład, od którego możesz zacząć. Obejmuje kompilację Nginx z modułem NHPM i zawiera kod dla prostych ról wydawcy / subskrybenta w jQuery, PHP i Bash.
http://blog.jamieisaacs.com/2010/08/27/comet-with-nginx-and-jquery/
źródło
PHP
Znalazłem zabawne małe screencasty wyjaśniające prostą kometę. Na marginesie, naprawdę myślę, że to zabije twój serwer przy każdym rzeczywistym obciążeniu. Mając tylko kilku użytkowników, powiedziałbym, że warto wybrać to rozwiązanie. To rozwiązanie jest naprawdę proste do wdrożenia (screencast zajmuje tylko 5 minut Twojego czasu :)). Ale jak mówiłem wcześniej, nie sądzę, żeby to było dobre dla wielu jednoczesnych użytkowników (chyba powinieneś to porównać;)), ponieważ:
filemtime()
,Alternatywy
Naprawdę uważam, że powinieneś wypróbować alternatywy, jeśli chcesz przeprowadzić badanie komet / długich sondaży. Możesz używać wielu języków, na przykład:
Samo wykonanie prostego wyszukiwania w Google pokaże ci wiele alternatyw, także PHP (które myślę, że przy każdym dużym obciążeniu zabije twój serwer).
źródło
mod_php nie jest jedynym sposobem korzystania z PHP. Możesz użyć fastcgi. PHP musi być skompilowane z
--enable-fastcgi
.PHP jako FastCGI: http://www.fastcgi.com/drupal/node/5?q=node/10
źródło
Możesz także spróbować https://github.com/reactphp/react
Wstępny przykład przedstawia prosty serwer HTTP nasłuchujący na porcie 1337:
<?php $i = 0; $app = function ($request, $response) use (&$i) { $i++; $text = "This is request number $i.\n"; $headers = array('Content-Type' => 'text/plain'); $response->writeHead(200, $headers); $response->end($text); }; $loop = React\EventLoop\Factory::create(); $socket = new React\Socket\Server($loop); $http = new React\Http\Server($socket); $http->on('request', $app); $socket->listen(1337); $loop->run();
źródło
Mam podobny problem. Jedną z interesujących opcji jest użycie istniejącego serwera Comet, takiego jak cometd-java lub cometd-python, jako głównego centrum wiadomości. Twój kod PHP jest wtedy tylko klientem serwera Comet - może wysyłać lub czytać wiadomości z kanałów, tak jak inni klienci.
Link do interesującego fragmentu kodu: http://morglog.org/?p=22=1, który implementuje część tej metody (chociaż są też fragmenty kodu debugowania).
źródło
Obecnie wdrażam skalowalny serwer PHP Comet przy użyciu funkcji gniazd. Nazywa się „phet” ([ph] p com [et])
Strona projektu: http://github.com/Tim-Smart/phet
Bezpłatnie za darmo dołączyć do rozwoju. Obecnie udało mi się wykonać większość logiki serwera, wystarczy dokończyć czynności po stronie klienta.
EDYCJA: Ostatnio dodane możliwości 'wielowątkowości' przy użyciu
pcntl_fork
metody :)źródło
Będziesz miał trudności z implementacją komety w PHP, tylko z powodu jej wrodzonej jednowątkowości.
Wypróbuj Websync On-Demand - usługa ta pozwala na integrację PHP poprzez publikowanie po stronie serwera, odciążając wiele jednoczesnych połączeń i pozwala błyskawicznie utworzyć aplikację do czatu w czasie rzeczywistym.
źródło
Właśnie pojawił się nowy moduł dla serwera WWW nginx, który pozwoli Comet na obsługę dowolnego języka, w tym PHP.
http://www.igvita.com/2009/10/21/nginx-comet-low-latency-server-push/
źródło
Będziesz musiał stworzyć własny serwer w PHP. Używanie Apache / mod_php lub nawet fastcgi w ogóle nie skaluje się. Kilka lat, ale możesz zacząć:
PHP-Comet-Server: http://sourceforge.net/projects/comet/
źródło
Myślę, że jest to bardziej problem, że posiadanie wielu wątków Apache działających przez cały czas jest problemem. Będzie to istniało z każdym językiem, jeśli działa przez apache w taki sam sposób, jak PHP (zwykle).
źródło