696

나는 비 쓰레드 나 쓰레드 안전과 같은 PHP 용 바이너리를 보았는가? 이것은 무엇을 의미 하는가? 이 패키지들의 차이점은 무엇입니까?


4 답변


606

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

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

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

PHP가 웹 서버와 어떻게 통합되는지에 대한 배경 지식 :

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

Apache와 다른 웹 서버로 PHP를 연결하는 다른 방법이 있지만 mod_php가 가장 많이 사용되는 방법이며 질문에 답변하는 역할도합니다.

호스팅 회사와 GNU / Linux 배포판은 우리를 위해 준비된 모든 것을 제공하기 때문에 이러한 세부 사항을 이해할 필요가 없을 수도 있습니다.

자, 질문에!

mod_php를 사용하면 PHP가 Apache로 바로로드되기 때문에 Apache가 Worker MPM (즉, Threads 사용)을 사용하여 동시성을 처리 할 경우 PHP는 동일한 멀티 스레드 환경에서 작동 할 수 있어야합니다. 즉,PHP는 Apache에서 올바르게 볼을 플레이 할 수 있으려면 thread-safe해야합니다!

이 시점에서 "OK, 그래서 멀티 쓰레딩 웹 서버를 사용하고 PHP를 바로 임베드한다면, PHP의 스레드 안전 버전을 사용해야합니다"라고 생각해야합니다. 그리고 이것은 올바른 생각 일 것입니다. 그러나, PHP의 thread-safety심하게 논박하다. 그것은 - 당신 - 정말로 - 정말로 - 정말로 - 알고 - 당신 -하는 - 일을하는 것입니다.

최종 노트

궁금한 점이 있으시면, 저의 개인적인 조언은아니다중 스레드 환경에서 PHP를 사용하십시오!

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

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

마지막으로, 스레드 안전성이 중요하지 않으므로 어떤 버전을 사용해야합니까? thread-safe 또는 thread-safe가 아닌? 솔직하게, 나는 과학적 대답이 없다! 하지만 스레드가 아닌 안전한 버전은 더 빠르고 버그가 적거나 그렇지 않으면 방금 스레드 안전 버전을 제공하고 선택의 여지가 없다고 생각합니다.


  • 그래서 PHP-FPM은 스레드되지 않았습니까? Fast CGI는 nginx 서버에서 사용되기 때문에 문제가 해결되었습니다. - Xeoncross
  • 신중한 세부 사항, 나는 PHP에서 수년간 프로그래밍을 해왔다. - pthurmond
  • @Xeoncross : 일반적으로 그게 옳고 실제로 Apache 외부에서 PHP 프로세스를 관리해야하는 가장 큰 이유 중 하나입니다. 내 대답에서이면을 살펴 보겠습니다. - J. M. Becker
  • PHP의 스레드 안전은 여전히 "매우 논쟁의 여지가 있습니다" (2014 년)? - sam
  • PHP의 스레드 안전은 여전히 "매우 논쟁의 여지가 있습니다" (2015 및 버전 7)? - Altiano Gerung

241

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

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

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


  • 대답은 다음과 같습니다. " worker가 MPM 인 Apache 모듈로 PHP를 설치하려면 스레드 안전 버전을 사용해야합니다. " - wlf
  • 스레드 안전은 ZTS와 동일합니까? - CMCDragonkai
  • 그래서 Windows에서 xampp 함께 오는 PHP는 NTS 또는 TS 무엇입니까? - Abudayah
  • PHP 내장 웹 서버를 사용한다면 어떨까요? 최적의 성능을 위해 사용할 PHP의 변종은 무엇입니까? - Dario
  • @Dario 나는 단지 윈도우라고 생각한다. - Greg

28

modphp로 아파치 MPM prefork가 구성 / 설치가 쉽기 때문에 사용됩니다. 성능면에서는 상당히 비효율적입니다. 스택, FastCGI / PHP-FPM을하는 나의 선호하는 방법. 그렇게하면 훨씬 더 빠른 MPM Worker를 사용할 수 있습니다. 전체 PHP는 스레드가 아닌 채로 남아 있지만 아파치는 스레드와 같은 역할을한다.

그래서 기본적으로 아래에서 위로

리눅스

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

PHP-FPM + APC

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


19

PHP 문서,

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

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

그래서 내가 무엇을 선택합니까? PHP를 CGI 바이너리로 실행하도록 선택한 경우   바이너리는 각각에서 호출되기 때문에 스레드 안전성은 필요 없습니다.   의뢰. IIS5 및 IIS6과 같은 다중 스레드 웹 서버의 경우   PHP의 스레드 버전을 사용해야합니다.

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

  • SNMP (Unix)
  • mSQL (유닉스)
  • IMAP (Win / Unix)
  • Sybase-CT (Linux, libc5)

연결된 질문


관련된 질문

최근 질문