Jednoczesne żądania do skryptu PHP

85

Jeśli silnik PHP jest już w trakcie wykonywania skryptu na serwerze, co stanie się z innymi równoczesnymi żądaniami przeglądarki skierowanymi do tego samego skryptu?

  • Czy wnioski będą umieszczane w kolejce?
  • Czy zostaną zignorowani?
  • Czy każde żądanie będzie miało własną instancję skryptu?
  • Jakaś inna możliwość?
Kevin Boyd
źródło
1
Sprawdź również tę odpowiedź: konrness.com/php5/how-to-prevent-blocking-php-requests
trante

Odpowiedzi:

140

Serwer w zależności od konfiguracji może generalnie obsługiwać setki żądań jednocześnie - w przypadku korzystania z Apache MaxClientsopcja konfiguracji mówi:

MaxClientsDyrektywa ustala limit liczby jednoczesnych żądań, które będą służyły.
Wszelkie próby połączenia przekraczające MaxClients limit będą zwykle umieszczane w kolejce, do liczby określonej na podstawie dyrektywy ListenBacklog.
Gdy proces potomny zostanie zwolniony na końcu innego żądania, połączenie zostanie następnie obsłużone.


Fakt, że dwóch klientów żąda tej samej strony, nie stanowi problemu.

Więc :

Czy wnioski będą umieszczane w kolejce?

Nie; chyba że:

  • gdzieś jest blokada - co może się zdarzyć, na przykład, jeśli dwa żądania pochodzą od tego samego klienta i używasz sesji opartych na plikach w PHP : podczas wykonywania skryptu sesja jest „zablokowana”, co oznacza, że ​​serwer / klient będzie musiał czekać do zakończenia pierwszego żądania (i odblokowania pliku ), aby móc użyć pliku do otwarcia sesji dla drugiego użytkownika.
  • żądania pochodzą od tego samego klienta ORAZ tej samej przeglądarki; większość przeglądarek będzie w tym przypadku kolejkować żądania, nawet jeśli nic nie powoduje takiego zachowania po stronie serwera.
  • jest więcej niż MaxClientsobecnie aktywnych procesów - zobacz cytat z podręcznika Apache tuż przed.


Czy zostaną zignorowani?

Nie: oznaczałoby to, że tylko jeden użytkownik może korzystać ze strony internetowej w tym samym czasie; to nie byłoby całkiem miłe, prawda?

Gdyby tak było, nie mógłbym opublikować tej odpowiedzi, gdybyś nacisnął F5 w tym samym momencie, aby zobaczyć, czy ktoś odpowiedział!
(Cóż, SO nie jest w PHP, ale zasady są takie same)


Jakaś inna możliwość?

Tak ^^


edytuj po edycji OP i komentarza:

Czy każde żądanie będzie miało własną instancję skryptu?

Nie ma czegoś takiego jak „ instancja skryptu ”: mówiąc prosto, to, co dzieje się, gdy wysyłane jest żądanie do skryptu, to:

  • serwer sieciowy forkuje inny proces do obsługi żądania (często ze względu na wydajność te rozwidlenia są tworzone z wyprzedzeniem, ale to nic nie zmienia)
  • proces odczytuje skrypt PHP z dysku
    • kilka procesów może to robić w tym samym czasie : nie ma blokady odczytu pliku
    • plik jest ładowany do pamięci; w osobnym bloku pamięci dla każdego procesu
  • plik PHP w pamięci jest „ kompilowany ” do opkodów - wciąż w pamięci
  • te rozkazy są wykonywane - nadal z bloku pamięci, który należy do procesu odpowiadającego na twoje żądanie


Naprawdę, możesz mieć dwóch użytkowników wysyłających żądanie do tego samego skryptu PHP (lub do różnych skryptów PHP, które zawierają ten sam plik PHP) ; to zdecydowanie nie jest problem, albo żadna z witryn, nad którymi kiedykolwiek pracowałem, nie zadziałała!

Pascal MARTIN
źródło
Jeśli wiele jednoczesnych żądań uzyskuje dostęp do tego samego pliku php, jaki byłby wynik. czy pozostałe żądania pozostaną w stanie oczekiwania, czy też każde żądanie będzie miało własną instancję skryptu?
Kevin Boyd,
3
Nie ma czegoś takiego jak „instancja skryptu”: każde żądanie jest przetwarzane przez odrębny proces (lub wątek) ;; skrypty są odczytywane z pamięci / dysku, ale ten sam plik można odczytać z wielu procesów jednocześnie bez problemu (przynajmniej na "nowoczesnych" systemach operacyjnych - tj. zarówno Windows jak i Linux)
Pascal MARTIN
To doskonała odpowiedź, gdzie mogę dowiedzieć się więcej o działaniu PHP? Jakaś dobra książka do tego?
Kevin Boyd,
1
Naprawdę nie wiem o tym: zgaduję, że przeglądanie podręcznika, czytanie artykułów w sieci, pytania / odpowiedzi tu i tam oraz praca z PHP przez kilka lat to dobry sposób na naukę - ale mogę ” naprawdę polecam każdą książkę, która wyjaśniałaby dokładnie, jak działa PHP ;; jest trochę informacji w "Rozszerzaniu i osadzaniu PHP", ale jego tematem nie jest wyjaśnienie, jak działa PHP ;; może php.net/manual/en/internals2.php może pomóc?
Pascal MARTIN,
Doskonałość! Bardzo mi pomogło !
zookastos
21

Jeśli 2 klientów wywołuje serwer w tym samym czasie, serwer najprawdopodobniej jest w stanie odpowiedzieć obu klientom prawie jednocześnie. Klientów tutaj definiuję na poziomie przeglądarki.

Oznacza to, że na tym samym komputerze, jeśli używasz 2 przeglądarek do ładowania tej samej witryny / strony w tym samym czasie, obie powinny być ładowane w tym samym czasie.

jednak skoro mówimy o PHP, musisz robić specjalne notatki na temat sesji. Jeśli Twoje strony używają sesji, serwer obsługuje tylko jedną stronę naraz. Dzieje się tak, ponieważ plik sesji zostanie zablokowany do momentu zakończenia działania skryptu.

Spójrz na ten przykład. Te 2 pliki są ładowane z tej samej sesji, czyli tej samej przeglądarki, tego samego użytkownika.

      scripta.php requested                 scripta.php served
------+---+---------------------------------+------------------------>
          scripta.php started

               scriptb.php requested           scriptb.php started
---------------+-------------------------------+-----------------+--->
                                                                 scriptb.php served.

Zauważ, że skrypt scriptb.php jest uruchamiany dopiero po udostępnieniu pliku scripta.php. Dzieje się tak, ponieważ po uruchomieniu scriptta.php plik sesji jest zablokowany dla innych skryptów, dzięki czemu scriptta.php może zapisywać w pliku sesji. Po zakończeniu działania scripta.php plik sesji zostaje odblokowany, a tym samym inne skrypty mogą go używać. W ten sposób skryptb.php będzie czekał, aż plik sesji zostanie zwolniony, a następnie zablokuje plik sesji i użyje go.

Ten proces będzie się powtarzał, aby zapobiec zapisywaniu przez wiele skryptów do tego samego pliku sesji, powodując opóźnienia. Dlatego zaleca się wywołanie session_write_close(), gdy nie korzystasz już z sesji, szczególnie na stronie internetowej używającej wielu ramek iframe lub AJAX.

Mauris
źródło
4

Właśnie wpadłem na to sam. Zasadniczo musisz zadzwonić, session_write_close()aby zapobiec blokowaniu pojedynczego użytkownika. Upewnij się jednak, że po wywołaniu session_write_close()nie próbujesz modyfikować żadnych zmiennych sesji. Po wywołaniu traktuj sesje od tej pory jako tylko do odczytu.

Justin
źródło
3

Jeśli nie korzystasz z bardzo niestandardowej konfiguracji, Twój serwer sieciowy (Apache, IIS, nginx itp.) Będzie miał wiele procesów, które będą uruchamiać PHP oddzielnie dla każdego żądania przychodzącego do serwera. Jednoczesne żądania będą obsługiwane jednocześnie.

conceptDawg
źródło