2011-11-11 12 views
5

Pracuję na stronie internetowej, która wyświetla niektóre dane z DB, które często się zmieniają (Stan kolejki i rozmowa na czacie). Moja obecna konfiguracja to Apache/PHP/MySQL. Naturalnie chciałbym uniknąć odpytywania serwera co x sekund, ponieważ nie jest to skalowalne. Chciałbym zrobić odwrotny sondowanie ajax długich, jednak czytałem, że Apache nie działa dobrze z tym, ponieważ szybko zabrakło wątków roboczych. Istnieje wiele innych serwerów internetowych, które rozwiązują ten problem: nginx, tornado, itp. Jednak moim problemem jest to, że PHP jest JEDYNYM językiem skryptowym po stronie serwera, jaki znam. Również napisałem już kilka skryptów PHP, więc chciałbym je zachować, jeśli mogę. Jestem w porządku z przełączaniem serwera, o ile mogę nadal używać PHP.Czy php jest skalowalny z długim sondowaniem wstecznym ajax?

Ale po przeprowadzeniu dalszych badań, przeczytałem, że ludzie mówią, że PHP (FPM?) Również tworzy proces dla każdego złożonego zapytania, co oznacza, że ​​jeśli mam setki/tysiące otwartych połączeń, będą setki/tysiące procesów, które również będą problemem.

Czy mogę dojść do wniosku, że nie ma dobrych, skalowalnych sposobów tworzenia długich stron z pollingu za pomocą PHP? Czy powinienem zrezygnować z PHP i nauczyć się języka skryptowego innego serwera? Mogę kontynuować rozwijanie długiego sondowania przy użyciu mojej obecnej konfiguracji (Apache/PHP), ale nie chcę, aby wybór języka skryptowego stwarzał jakiekolwiek ograniczenia dotyczące skalowalności mojego systemu podczas wdrażania. Więc co powinienem zrobić? Nie mam zbyt dużego doświadczenia z programowaniem w Internecie, więc jeśli któryś z guru może dać mi jakieś wskazówki, byłbym wdzięczny! Dziękuję Ci!

+1

Nie zrobić tego sam, ale przy użyciu gniazd js może być opcja? być może również za pomocą node.js. Natywne wsparcie dla websockets w przeglądarkach jest poprawne, ale zgaduję, że wtyczka jquery to obsługuje? –

+0

Nie biorę pod uwagę websocket, ponieważ nie jest on obsługiwany we wszystkich najważniejszych przeglądarkach. W rzeczywistości zajrzałem do pliku node.js, ale z tego, co słyszałem, wynika, że ​​jest on wciąż stosunkowo nowy, więc obsługa ram jest bardziej ograniczona. Obecnie rozważam Django, co oznacza, że ​​muszę odebrać pythona. Słyszałem dobre rzeczy o strukturze, ale wolałbym pozostać przy php, jeśli jest sposób na obejście wydajności. – pinghsien422

+0

Zdecydowanie zrewiduję plik node.js - proste żądanie ajax do portu serwera, na którym działa node.js, może być po prostu lewą. –

Odpowiedz

7

PHP uruchomione w trybie php-fpm nadal będzie miało ograniczenia, szczególnie jeśli twój kod zużywa dużo pamięci. Nie będzie można uruchomić tysięcy równoległych procesów bez dostępnej pamięci. Ale zwykle działa szybciej niż mod_php, a przynajmniej żądanie HTTP, które nie wymaga PHP, jest obsługiwane przez serwer WWW, a jeśli ten serwer jest nginx, dostaniesz znacznie więcej żądań HTTP dostępnych równolegle.

Dzięki php-fpm będziesz mieć również kolejkę oczekujących żądań, które mogą być użyteczne w przypadku tymczasowego dużego ruchu, ponieważ co najmniej żądania są umieszczane w kolejce, a nie odrzucane.

Teraz długie operacje pollingu są w porządku z nginx (lub innymi, to jest przykład), ale nie z PHP. PHP nie jest zbudowane jako długo działający serwer, każde żądanie jest nowym procesem, to naprawdę nie jest właściwy wybór dla rzeczy typu KeepAlive. Ale "Divide ut regnes" (dziel i rządź). Twoje długie zadania odpytywania mogą przebiegać w pobliżu twojej aplikacji PHP, ale bez twojej aplikacji PHP.

Jako przykład spójrz na jappix project, jest to projekt PHP. Ale musisz umieścić gdzieś serwer XMPP (np. Ejabberd) i serwer BOSH z nginx jako proxy na porcie 80 do tego serwera BOSH (masz więc protokół czatowania xmpp na porcie 80, przez nginx i ejabberd, i nic na po stronie PHP). Problem polega na tym, aby połączyć uwierzytelnianie aplikacji, identyfikację i tym podobne, a to trzeba będzie zrobić, rozszerzając konfigurację serwera XMPP (tak, aby korzystał z tego samego serwera LDAP co na przykład aplikacja PHP).

Twój drugi długi problem z odpytywaniem jest stanem kolejki. Być może znajdziesz jakieś rozszerzenia XMPP. Lub możesz wykonywać regularne zapytania ajax w kolejce. Jedną z przydatnych technik unikania dużej liczby żądań ajaxowych w twojej aplikacji PHP jest przełożenie kolejnej kontroli ajaxowej na wywołanie ajax czeku, oparte na liczbach Fibonacciego (to jest przykład). Tak więc po raz pierwszy następne wywołanie ajaxowe zostanie zaplanowane 1 minuta po, następnym razem 2 minuty, potem 3m, 5m, 8m, 13m, 21m, 34m, 55m, 89m, 144m itd. Pomysł polega na tym, że może warto sprawdzić nowe wiadomości przychodzące 1 minuta po załadowaniu strony. Ponieważ użytkownik nadal czyta tę samą stronę (lub pije kawę, rozmawia z przyjacielem, wyjeżdża na wakacje bez wyłączania komputera itp.), Możemy opóźniać kolejne kontrole.Czy sposób zakładania użytkownika nie jest naprawdę aktywny? Pamiętaj, że możesz wykryć aktywność użytkownika w inny sposób i zmienić harmonogram zmiany harmonogramu.

-1

PHP nie jest odpowiednie dla długich sondowań, technologii Comet i reverse ajax. Powinieneś użyć Node.js

+1

proszę podać kilka powodów, zamiast odpowiadać w jednym wierszu. – pascalhein