Widziałem różne pliki binarne dla PHP, np. Bezpieczne dla wątków lub wątków?
Co to znaczy?
Jaka jest różnica między tymi pakietami?
Widziałem różne pliki binarne dla PHP, np. Bezpieczne dla wątków lub wątków?
Co to znaczy?
Jaka jest różnica między tymi pakietami?
Odpowiedzi:
Różne serwery WWW wdrażają różne techniki równoległego przetwarzania przychodzących żądań HTTP. Dość popularną techniką jest używanie wątków - to znaczy serwer WWW utworzy / poświęci jeden wątek dla każdego przychodzącego żądania. Serwer WWW Apache HTTP obsługuje wiele modeli do obsługi żądań, z których jeden (zwany MPM procesu roboczego) używa wątków. Ale obsługuje inny model współbieżności zwany prefork MPM, który wykorzystuje procesy - to znaczy, że serwer WWW utworzy / dedykuje pojedynczy proces dla każdego żądania.
Istnieją również inne całkowicie różne modele współbieżności (wykorzystujące gniazda asynchroniczne i wejścia / wyjścia), a także takie, które łączą ze sobą dwa, a nawet trzy modele. Aby odpowiedzieć na to pytanie, zajmujemy się tylko dwoma powyższymi modelami i przykładem serwera HTTP Apache.
Sam PHP nie odpowiada na rzeczywiste żądania HTTP - jest to zadanie serwera WWW. Tak więc konfigurujemy serwer WWW, aby przekazywał żądania do PHP w celu przetworzenia, a następnie odbierał wynik i wysyłał go z powrotem do użytkownika. Istnieje wiele sposobów połączenia serwera WWW z PHP. W przypadku serwera HTTP Apache najpopularniejszym jest „mod_php”. Ten moduł to tak naprawdę sam PHP, ale skompilowany jako moduł dla serwera WWW, więc jest ładowany bezpośrednio w nim.
Istnieją inne metody łączenia PHP z Apache i innymi serwerami WWW, ale mod_php jest najbardziej popularny i będzie również służył do odpowiedzi na twoje pytanie.
Być może wcześniej nie musieliście rozumieć tych szczegółów, ponieważ firmy hostingowe i dystrybucje GNU / Linux mają wszystko przygotowane dla nas.
Ponieważ w przypadku mod_php PHP jest ładowane bezpośrednio do Apache, jeśli Apache będzie obsługiwał współbieżność za pomocą Worker MPM (to znaczy przy użyciu Threads), wówczas PHP musi być w stanie działać w tym samym środowisku wielowątkowym - co oznacza, że PHP musi bądź bezpieczny, aby poprawnie grać w piłkę dzięki Apache!
W tym momencie powinieneś pomyśleć „OK, więc jeśli używam wielowątkowego serwera WWW i zamierzam bezpośrednio w nim osadzić PHP, to muszę użyć bezpiecznej dla wątków wersji PHP”. I to byłoby prawidłowe myślenie. Jednak, jak się zdarza, bezpieczeństwo wątków PHP jest wysoce kwestionowane . Jest to grunt przydatny, jeśli naprawdę wiesz, co robisz.
Jeśli się zastanawiasz, moją osobistą radą byłoby nie używać PHP w środowisku wielowątkowym, jeśli masz wybór!
Mówiąc tylko o środowiskach opartych na Uniksie, powiedziałbym, że na szczęście musisz o tym pomyśleć tylko wtedy, gdy zamierzasz używać PHP z serwerem WWW Apache, w którym to przypadku zalecamy skorzystanie z prefabrykatu MPM Apache (który nie używa wątków, dlatego bezpieczeństwo wątków PHP nie ma znaczenia) i wszystkie znane mi dystrybucje GNU / Linux podejmą tę decyzję, gdy instalujesz Apache + PHP przez ich system pakietów, nawet nie pytając do wyboru. Jeśli zamierzasz używać innych serwerów WWW, takich jak nginx lub lighttpd , i tak nie będziesz mieć możliwości osadzenia w nich PHP. Będziesz patrzył na użycie FastCGI lub czegoś podobnego, co działa w innym modelu, w którym PHP jest całkowicie na zewnątrzserwera WWW z wieloma procesami PHP używanymi do odpowiadania na żądania poprzez np. FastCGI. W takich przypadkach bezpieczeństwo wątków również nie ma znaczenia. Aby zobaczyć, z której wersji korzysta Twoja witryna, umieść plik <?php phpinfo(); ?>
na swojej stronie i poszukaj Server API
wpisu. To może powiedzieć coś w stylu CGI/FastCGI
lub Apache 2.0 Handler
.
Jeśli spojrzysz również na wersję PHP wiersza polecenia - bezpieczeństwo wątków nie ma znaczenia.
Na koniec, jeśli bezpieczeństwo wątków nie ma znaczenia, jakiej wersji należy użyć - wątkowo bezpiecznej lub nie-wątkowej? Szczerze mówiąc, nie mam naukowej odpowiedzi! Ale zgaduję, że wersja nie bezpieczna dla wątków jest szybsza i / lub mniej wadliwa, w przeciwnym razie zaoferowaliby wersję bezpieczną dla wątków i nie zadawali sobie trudu, aby dać nam wybór!
Dla mnie zawsze wybieram bezpieczną wersję bez wątków, ponieważ zawsze używam nginx lub uruchamiam PHP z wiersza poleceń.
Niebezpieczna wersja powinna być używana, jeśli instalujesz PHP jako plik binarny CGI, interfejs wiersza poleceń lub inne środowisko, w którym używany jest tylko jeden wątek.
Wersja bezpieczna dla wątków powinna być używana, jeśli instalujesz PHP jako moduł Apache w MPM pracującym (model z wieloma procesami przetwarzania) lub w innym środowisku, w którym wiele wątków PHP działa jednocześnie.
Używa się prefabrykatu Apache MPM z modphp, ponieważ jest łatwy do skonfigurowania / instalacji. Pod względem wydajności jest dość nieefektywny. Mój preferowany sposób tworzenia stosu, FastCGI / PHP-FPM. W ten sposób możesz użyć znacznie szybszego MPM Worker. Cały PHP pozostaje wątkiem, ale Apache obsługuje wątki (tak jak powinno).
Zasadniczo od dołu do góry
Linux
Apache + MPM Worker + ModFastCGI (NOT FCGI) | (lub) | Cherokee | (lub) | Nginx
PHP-FPM + APC
ModFCGI nie obsługuje poprawnie PHP-FPM ani żadnych zewnętrznych aplikacji FastCGI. Obsługuje tylko niezarządzane skrypty FastCGI. PHP-FPM jest menedżerem procesów PHP FastCGI.
Jak na PHP Dokumentacji ,
Bezpieczeństwo wątków oznacza, że plik binarny może działać w kontekście wielowątkowego serwera WWW, takiego jak Apache 2 w systemie Windows. Bezpieczeństwo wątków polega na utworzeniu lokalnej pamięci do przechowywania w każdym wątku, aby dane nie kolidowały z innym wątkiem.
Więc co mam wybrać? Jeśli zdecydujesz się uruchomić PHP jako plik binarny CGI, nie będziesz potrzebować bezpieczeństwa wątków, ponieważ plik binarny jest wywoływany przy każdym żądaniu. W przypadku wielowątkowych serwerów WWW, takich jak IIS5 i IIS6, należy użyć wątkowej wersji PHP.
Następujące biblioteki nie są bezpieczne dla wątków. Nie są zalecane do stosowania w środowisku wielowątkowym.