2012-03-16 14 views
8

Mam nadzieję, że mogę to wyjaśnić wystarczająco dobrze. Pracuję nad stworzeniem PHP library to handle ajax requests through PHP w sposób zorientowany na obiekt. Obecnie zastanawiam się nad dobrym sposobem wdrożenia długiego rozwiązania, ale jestem ciekaw czegoś.Long Polling z PHP na Apache

Apache nie obsługuje otwierania wielu połączeń bardzo dobrze. Model wątku na żądanie sprawia, że ​​Apache jest wysoce nieefektywny w przypadku długiego sondowania. Korzystanie z serwerów takich jak nginx i lighttpd znacznie lepiej radzi sobie z tymi wątkami, dlatego w bibliotece planuję wdrażać różne funkcje zoptymalizowane pod kątem konkretnych serwerów dostępnych z jednego wywołania funkcji. W przypadku Apache, który ma ogromny udział w rynku aplikacji PHP, potrzebuję lepszego rozwiązania.

Czy istnieje sposób umieszczenia przychodzącego żądania w trybie wstrzymania/wstrzymania i kontynuowania przetwarzania innych żądań, dopóki nie będę gotowy do ponownej aktywacji?

Nie jestem pewien, czy to ma sens, czy jestem na dobrej drodze. Jakie jest możliwe rozwiązanie, które SO zaleca dla długiego sondowania w PHP na serwerze Apache?

+0

dlaczego warto wstrzymać przetwarzanie na serwerze? Czy nie zmusiłoby to twojego użytkownika do częstego oczekiwania? – Joseph

+0

Używając Apache, używa modelu wątku na żądanie, więc początkowe żądanie strony w aplikacji używa wątku, a następnie żądanie ajax (wywoływane po wczytaniu DOM) będzie używać osobnego wątku. Problem polega na tym, że ruch o dużym natężeniu powoduje odradzanie się tysięcy wątków i ostatecznie wyłącza serwer. –

+0

Mieliśmy podobny problem, po włączeniu długich stron pollingu ajax/PHP ładunki zaczęły się losowo (cca co 4-5) zabierając zbyt dużo czasu ... na razie i tylko dla uwag rozwiązałem to przez NOT sleep() w PHP w jakikolwiek sposób, i przeniósł funkcję timewait do javascript, więc teraz javascript żąda wykonania każdego PHP na przykład 10s, ale ładowanie strony wydaje się teraz OK. –

Odpowiedz

1

To brzmi jak ciąg dalszy. Z pewnością nie można tego zrobić w PHP w żaden elegancki sposób. Jeśli chcesz to zrobić, Twoja najlepsza szansa to zapisanie bieżącego stanu i napisanie kodu w taki sposób, aby można było wznowić od miejsca, w którym zostało przerwane po załadowaniu stanu.

+0

Zaczynam dochodzić do tego samego wniosku. Myślę, że zamierzam zaimplementować podstawowe rozwiązanie do długiego odpytywania, aw dokumentacji/komentarzach zaznaczę, że jest on mniejszy niż optymalny w niektórych środowiskach serwerowych. W ten sposób, jeśli ktoś chce spróbować go użyć, podstawowa funkcjonalność już istnieje. –

0

Nie sądzę, że istnieje rozwiązanie. Nie można odróżnić żądania odpytywania od zwykłego żądania. Należy tylko unikać Apache, które mogą pomóc (np. Uruchamiać nginx na 80, przekazywać wszystkie żądania do Apache na 81, z wyjątkiem żądań odpytywania).

Też nie sądzę, że masz problem. Nginx lub inny serwer nie jest dużo bardziej wydajny niż Apache. Polling jest żądaniem PHP, Apache z mod_php jest mniej lub więcej dobrym wyborem. Nginx nie użyje mniej zasobów niż Apache podczas serwowania PHP.

+4

'Nginx nie użyje mniej zasobów niż Apache w obsłudze PHP. Czy jesteś tego pewien? http://serverfault.com/questions/157520/apache-vs-nginx –

+0

Pewnie. Nie czytam niczego w tym adresie, stwierdzając coś przeciwnego. "mod_php jest marginalnie szybsze niż php-fpm", "cgi jest znacznie wolniejsze niż mod_php" itd. Oczywiście wszystkie zależą od tego, jak długo wykonujesz polling względem normalnych plików PHP/statycznych, jeśli masz buforujący serwer odwrotnego proxy, że Apache nie ma kłopotów z plikami statycznymi, o ile modułów używasz w Apache ... – jcisio