Co jest bezpieczne w wątku lub bezpieczne w wątku w PHP?

772

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?

O ..
źródło
18
Możesz przeczytać o bezpieczeństwie wątków na en.wikipedia.org/wiki/Thread_safety Odnośnie PHP: Czy PHP jest bezpieczne dla wątków Nie wierz w kłamstwa: PHP nie jest jeszcze bezpieczne dla wątków Różnica między bezpiecznymi wątkami PHP a nie bezpiecznymi wątkami binarie Tam dostępnych jest wiele zasobów. Szukaj tutaj w Stackoverflow lub Google.
TigerTiger

Odpowiedzi:

667

Potrzebne doświadczenie w podejściach do współbieżności:

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.

Potrzebne tło, w jaki sposób PHP „integruje się” z serwerami WWW:

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.

Teraz na twoje pytanie!

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.

Uwagi końcowe

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 APIwpisu. To może powiedzieć coś w stylu CGI/FastCGIlub 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!

Amr Mostafa
źródło
2
Więc PHP-FPM nie ma wątków? To rozwiązuje problem, ponieważ Fast CGI jest używany na serwerach Nginx.
Xeoncross,
41
Niesamowite szczegóły, programuję w PHP od lat i nigdy o tym nie wiedziałem.
Patrick,
1
@Xeoncross: Zasadniczo jest to poprawne, aw praktyce jest to jeden z wielkich powodów do zarządzania procesami PHP poza Apache. Omawiam ten aspekt w swojej odpowiedzi.
JM Becker,
Jedynym problemem jest to, że PHP-FPM nie jest dostępny w systemie Windows. Przynajmniej jako natywna wersja.
Denis V,
9
Czy bezpieczeństwo wątków PHP jest nadal „bardzo kwestionowane” (w 2015 r. I wersji 7)?
Altiano Gerung,
261

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.

Greg
źródło
1
greg twoja odpowiedź powinna być następująca: „Jeśli chcesz zainstalować PHP jako moduł Apache, w którym pracownikiem jest MPM, należy użyć wersji Safe Safe”
wlf,
9
więc php, że pochodzący z Xampp na Windows to NTS lub TS?
Abudayah
1
Co jeśli korzystasz z wbudowanego serwera PHP? Którego wariantu PHP użyć, aby uzyskać optymalną wydajność?
Ariod
1
@Dario Myślę, że to tylko Windows.
Greg
1
@ChristopherShaw koleś, odpowiedź zawiera TYLKO opinię. Nie ma źródła ani powodu DLACZEGO używać ZTS w połączeniu z modułem Apache. To nie jest poprawna odpowiedź. Nawet 217 ppl może się mylić m8.
Daniel W.,
30

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.

JM Becker
źródło
21

Jak na PHP Dokumentacji ,

Co oznacza bezpieczeństwo wątków podczas pobierania PHP?

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.

  • SNMP (Unix)
  • mSQL (Unix)
  • IMAP (Win / Unix)
  • Sybase-CT (Linux, libc5)
Somnath Muluk
źródło