PHP에서 스레드 안전 또는 비 스레드 안전이란 무엇입니까?


773

스레드가 아닌 스레드 안전과 같은 PHP의 다른 바이너리를 보았습니까?

이것은 무엇을 의미 하는가?

이 패키지들의 차이점은 무엇입니까?


18
당신은 약에 스레드로부터의 안전성 읽을 수 en.wikipedia.org/wiki/Thread_safety : PHP에 관한 것입니다 PHP 스레드 안전 음주 거짓말을 믿지 : PHP는 스레드 안전하지만 아닌가요 PHP 스레드 안전 및 비 스레드 안전 binarie의 차이 가 사용할 수있는 많은 리소스가 있습니다. Stackoverflow 또는 Google에서 여기를 검색하십시오.
TigerTiger

답변:


668

동시성 접근에 필요한 배경 :

다른 웹 서버는 들어오는 HTTP 요청을 병렬로 처리하기 위해 다른 기술을 구현합니다. 널리 사용되는 기술은 스레드를 사용하는 것입니다. 즉, 웹 서버는 들어오는 각 요청에 대해 단일 스레드를 작성 / 전용합니다. Apache HTTP 웹 서버는 요청을 처리하기위한 여러 모델을 지원하며이 중 하나 (작업자 MPM이라고 함)는 스레드를 사용합니다. 그러나 프로세스를 사용하는 prefork MPM이라는 다른 동시성 모델을 지원합니다. 즉, 웹 서버는 각 요청에 대해 단일 프로세스를 작성 / 전용합니다.

완전히 다른 다른 동시성 모델 (비동기 소켓 및 I / O 사용)과 2 개 또는 3 개의 모델을 함께 혼합 한 모델도 있습니다. 이 질문에 답하기 위해 위의 두 모델에만 관심이 있으며 Apache HTTP 서버를 예로 들어 설명합니다.

PHP가 웹 서버와 "통합"되는 방법에 대한 배경 지식 :

PHP 자체는 실제 HTTP 요청에 응답하지 않습니다. 이것은 웹 서버의 작업입니다. 따라서 처리를 위해 요청을 PHP로 전달하도록 웹 서버를 구성한 다음 결과를 수신하여 사용자에게 다시 보냅니다. 웹 서버를 PHP와 연결하는 방법에는 여러 가지가 있습니다. Apache HTTP Server의 경우 가장 인기있는 것은 "mod_php"입니다. 이 모듈은 실제로는 PHP 자체이지만 웹 서버용 모듈로 컴파일되므로 바로 내부에로드됩니다.

PHP를 Apache 및 다른 웹 서버와 연결하는 다른 방법이 있지만 mod_php가 가장 많이 사용되며 질문에 대한 답변을 제공합니다.

호스팅 회사와 GNU / Linux 배포판에는 준비된 모든 것이 포함되어 있기 때문에 이러한 세부 사항을 이해하지 않아도 될 수도 있습니다.

지금, 당신의 질문에!

mod_php를 사용하면 PHP가 Apache로 바로로드되므로 Apache가 Worker MPM을 사용하여 (즉, Threads를 사용하여) 동시성을 처리하는 경우 PHP는 동일한 멀티 스레드 환경 내에서 작동 할 수 있어야 합니다. 아파치에서 볼을 올바르게 플레이 할 수 있도록 스레드 안전을 유지하십시오!

이 시점에서 "괜찮습니다. 따라서 다중 스레드 웹 서버를 사용하고 있고 PHP를 바로 포함 시키려면 스레드 안전 버전의 PHP를 사용해야합니다"라고 생각해야합니다. 그리고 이것은 올바른 생각입니다. 그러나 PHP의 스레드 안전성 은 매우 논쟁의 여지가 있습니다. 실제로 사용하는 경우 실제로 알고있는 것입니다.

최종 노트

궁금한 점이 있다면, 개인 의 선택에 따라 멀티 스레드 환경에서 PHP를 사용 하지 않는 것이 좋습니다!

유닉스 기반 환경에 대해서만 말하면, 다행히도 아파치 웹 서버에서 PHP를 사용하려는 경우에만이를 생각해야한다고 생각합니다.이 경우 Apache의 prefork MPM과 함께하는 것이 좋습니다 스레드를 사용하지 않으므로 PHP 스레드 안전은 중요하지 않습니다.) 알고있는 모든 GNU / Linux 배포판은 패키지 시스템을 통해 Apache + PHP를 설치할 때 메시지를 표시하지 않고 결정을 내립니다. 선택을 위해. nginx 또는 lighttpd 와 같은 다른 웹 서버를 사용하려는 경우 어쨌든 PHP를 포함시킬 수있는 옵션이 없습니다. PHP가 완전히 외부 에있는 다른 모델에서 작동 하는 FastCGI 또는 이와 동등한 것을 사용하는 것을 볼 것입니다FastCGI를 통해 요청에 응답하는 데 사용되는 여러 PHP 프로세스가있는 웹 서버 이러한 경우 스레드 안전성도 중요하지 않습니다. 귀하의 웹 사이트에서 사용중인 버전을 확인하려면 귀하의 사이트에 포함 <?php phpinfo(); ?>된 파일을 넣고 해당 Server API항목을 찾으십시오 . 이것은 CGI/FastCGI또는 같은 것을 말할 수 Apache 2.0 Handler있습니다.

PHP의 명령 행 버전을 보면 스레드 안전성은 중요하지 않습니다.

마지막으로 스레드 안전성이 중요하지 않은 경우 스레드 안전성 또는 스레드 안전성이 아닌 버전을 사용해야합니다. 솔직히 과학적인 대답은 없습니다! 그러나 스레드 안전하지 않은 버전이 더 빠르거나 덜 버그가 많거나 스레드 안전 버전을 제공했을뿐 아니라 선택의 여지가 없습니다.


2
PHP-FPM은 스레드되지 않습니까? nginx 서버에서 Fast CGI가 사용되므로 문제가 해결됩니다.
Xeoncross

41
멋진 세부 사항, 나는 수년간 PHP로 프로그래밍 해 왔으며 이것을 결코 알지 못했습니다.
Patrick

1
@ Xeoncross : 일반적으로 맞습니다. 실제로 Apache 외부에서 PHP 프로세스를 관리해야하는 가장 큰 이유 중 하나입니다. 나는 대답 에서이 측면을 살펴 봅니다.
JM Becker

여기서 유일한 문제는 Windows에서 PHP-FPM을 사용할 수 없다는 것입니다. 최소한 기본 빌드로.
Denis V

9
PHP의 스레드 안전성이 여전히 "고 분쟁"입니까 (2015 및 버전 7)?
Altiano Gerung

261

나를 위해, 나는 항상 비 스레드 안전 선택할 난 항상 nginx를 사용하거나 명령 줄에서 PHP를 실행하기 때문에 버전.

PHP를 CGI 바이너리, 명령 행 인터페이스 또는 단일 스레드 만 사용하는 기타 환경으로 설치하는 경우 스레드가 아닌 안전 버전을 사용해야합니다.

작업자 MPM (다중 처리 모델) 또는 여러 PHP 스레드가 동시에 실행되는 기타 환경에서 PHP를 Apache 모듈로 설치하는 경우 스레드 안전 버전을 사용해야합니다.


1
"worker가 MPM 인 Apache 모듈로 PHP를 설치하려면 Thread Safe 버전을 사용해야합니다"
wlf

9
그래서 Windows에서 xampp와 함께 제공되는 PHP는 NTS 또는 TS입니까?
Abudayah

1
PHP 내장 웹 서버를 사용하면 어떻게됩니까? 최적의 성능을 위해 사용할 PHP의 변형은 무엇입니까?
Ariod

1
@ 다리오 나는 그것이 단지 Windows라고 생각합니다.
Greg

1
@ChristopherShaw 친구, 대답은 의견 만 포함합니다. WHY가 Apache 모듈과 함께 ZTS를 사용해야하는 소스 나 이유는 없습니다. 올바른 답변이 아닙니다. 217 ppl조차도 잘못된 m8 일 수 있습니다.
Daniel W.

30

modphp가 포함 된 Apache MPM 프리 포크는 구성 / 설치가 쉽기 때문에 사용됩니다. 성능면에서는 상당히 비효율적입니다. 스택, FastCGI / PHP-FPM을 선호하는 방법입니다. 그렇게하면 훨씬 빠른 MPM 작업자를 사용할 수 있습니다. 전체 PHP는 스레드되지 않은 상태로 유지되지만 Apache는 스레드와 같은 방식으로 서비스를 제공합니다.

기본적으로 아래에서 위로

리눅스

Apache + MPM Worker + ModFastCGI (FCGI 아님) | (또는) | 체로키 | (또는) | 니 진스

PHP-FPM + APC

ModFCGI는 PHP-FPM 또는 외부 FastCGI 응용 프로그램을 올바르게 지원하지 않습니다. 비 프로세스 관리 FastCGI 스크립트 만 지원합니다. PHP-FPM은 PHP FastCGI 프로세스 관리자입니다.


21

당으로 PHP 문서 ,

PHP를 다운로드 할 때 스레드 안전성은 무엇을 의미합니까?

스레드 안전성은 바이너리가 Windows의 Apache 2와 같은 멀티 스레드 웹 서버 컨텍스트에서 작동 할 수 있음을 의미합니다. 스레드 안전성은 각 스레드에서 로컬 스토리지 사본을 작성하여 데이터가 다른 스레드와 충돌하지 않도록합니다.

그래서 나는 무엇을 선택합니까? PHP를 CGI 바이너리로 실행하도록 선택하면 바이너리는 각 요청마다 호출되므로 스레드 안전성이 필요하지 않습니다. IIS5 및 IIS6과 같은 다중 스레드 웹 서버의 경우 스레드 버전의 PHP를 사용해야합니다.

다음 라이브러리는 스레드 안전하지 않습니다. 다중 스레드 환경에서는 사용하지 않는 것이 좋습니다.

  • SNMP (유닉스)
  • mSQL (유닉스)
  • IMAP (Win / Unix)
  • Sybase-CT (Linux, libc5)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.