2013-02-20 14 views
6

Witam, moje pytanie brzmi, w jaki sposób przepływ danych działa dokładnie w serwerze WWW Apache + PHP.apache php> user requests

Gdy użytkownik uzyskuje dostęp do adresu URL: localhost/index.php iw tym samym czasie, gdy inny użytkownik uzyskuje dostęp do tego samego adresu URL, to domyślam się, że żądania są wykonywane jeden po drugim (bez wielowątkowych), a pierwszy użytkownik otrzymuje odpowiedź, a następnie inny.

pytanie brzmi: jeśli jakoś pierwsza prośba pozostanie w pętli przez dłuższy czas, np. 1min, inni użytkownicy powinni poczekać na pierwszą prośbę, aby zakończyć, a ich żądania zostaną zakończone, aby uzyskać odpowiedź od serwera WWW Apache + PHP? jeśli odpowiedź brzmi "tak" (inni użytkownicy powinni czekać w kolejce): czy możemy wysyłać żądania do wykonania równolegle (wielowątkowo), aby zapobiec oczekiwaniu w kolejce

+0

Apache ma kilka modeli wielowątkowych do wyboru, a PHP ma kilka dostępnych SAPI. W praktyce jest to nieistotne z punktu widzenia kodowania. –

Odpowiedz

9

Podczas gdy PHP może być pojedynczym wątkiem, Apache może uruchamiać wiele -proces i wielowątkowe. Pozwala to na jednoczesne wykonywanie wielu żądań. Możesz skonfigurować liczbę równoczesnych żądań w rzeczywistości.

Możesz zobaczyć, jak Apache obsługuje te żądania na żywo, zobaczyć, które czekają i które są przesyłane przez mod_status (http://httpd.apache.org/docs/2.2/mod/mod_status.html).

+1

jak o tym samym skrypcie jest wywoływane do wykonania i pierwsze żądanie zamrozić więcej niż 1min? –

+0

Masz na myśli dwóch różnych użytkowników? W takim przypadku tak. Apache będzie obsługiwał wielu, wielu użytkowników w tym samym czasie. Można to porównać do wielu serwerów Apache działających niezależnie i nie dbających o to, co robią inne, mimo że jest to tylko jedna instalacja Apache. –

+2

Mam skrypt, który działa 8 godzin po wywołaniu go z przeglądarki, ale gdy próbuję otworzyć jakiś inny skrypt z innej karty przeglądarki, otrzymuję tylko ładowanie jak oczekiwanie na odpowiedź (problem powinien być chrome), ale jeśli otworzę z innej przeglądarki (ie9) Mogę uzyskać odpowiedź jak najszybciej, to dowodzi, że apache jest wielowątkowy. –

2

Apache ma wiele wątków, więc wiele skryptów PHP może działać jednocześnie.

Serwery sieci Web, takie jak Nginx, wykorzystują architekturę opartą na zdarzeniach. Asynchroniczne operacje we/wy i cały ten jazz.

Serwery internetowe mają zazwyczaj mechanizm umożliwiający obsługę więcej niż jednego żądania na raz lub przynajmniej sprawiają wrażenie, że mogą.

Apache używa wątków, Nginx używa pętli zdarzeń, ale nie są one serią w tym sensie, w jakim chcesz. Powód jest bardzo prosty: marnuje zasoby. Podczas gdy twój skrypt PHP czeka, aż twardy dysk przejdzie na właściwą pozycję, abyś mógł przeczytać blok z pliku, który czytasz, równie dobrze mógłbyś robić coś innego, np. obsłużyć inne żądanie, które teraz nie wymaga operacji we/wy.

Jeśli jest to kluczowe, niektóre żądania kończą się, zanim inni użytkownicy zgłoszą prośby, a następnie powinniście rozważyć przejście na bardziej asynchroniczną architekturę niezwiązaną z podziałem. Nie wiem, jak zainwestowałeś w swoje obecne rozwiązanie. Obsługa zdarzeń może być zaimplementowana po prostu jako prosta ankieta lub nawet long poll.

+1

jak mogę zrozumieć z twojej odpowiedzi apache jest wielowątkowa i wykonuje równolegle żądania w tym samym czasie w teorii. ale co powiesz na to, czy ten sam skrypt jest wywoływany do wykonania i pierwsze żądanie zamrożenia trwa dłużej niż 1min? drugie żądanie zostanie wykonane w tym samym czasie lub będzie czekać na zakończenie pierwszego żądania? –