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ść?
Odpowiedzi:
Serwer w zależności od konfiguracji może generalnie obsługiwać setki żądań jednocześnie - w przypadku korzystania z Apache
MaxClients
opcja konfiguracji mówi:Fakt, że dwóch klientów żąda tej samej strony, nie stanowi problemu.
Więc :
Nie; chyba że:
MaxClients
obecnie aktywnych procesów - zobacz cytat z podręcznika Apache tuż przed.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)
Tak ^^
edytuj po edycji OP i komentarza:
Nie ma czegoś takiego jak „ instancja skryptu ”: mówiąc prosto, to, co dzieje się, gdy wysyłane jest żądanie do skryptu, to:
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!
źródło
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.
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.źródło
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łaniusession_write_close()
nie próbujesz modyfikować żadnych zmiennych sesji. Po wywołaniu traktuj sesje od tej pory jako tylko do odczytu.źródło
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.
źródło