Nice programing

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

nicepro 2020. 9. 29. 18:43
반응형

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


비 스레드 또는 스레드 안전과 같은 PHP 용 다른 바이너리를 보셨습니까? 이것은 무엇을 의미 하는가? 이 패키지의 차이점은 무엇입니까?


동시성 접근 방식에 대한 배경 지식 :

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

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

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

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

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

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

이제 귀하의 질문에!

mod_php를 사용하면 PHP가 Apache에 바로로드되므로 Apache가 작업자 MPM (즉, 스레드 사용)을 사용하여 동시성을 처리하려면 PHP가 동일한 다중 스레드 환경 내에서 작동 할 수 있어야합니다. 즉, PHP는 Apache로 올바르게 공을 칠 수 있도록 스레드로부터 안전해야합니다!

이 시점에서 여러분은 "좋아, 멀티 스레드 웹 서버를 사용하고 있고 여기에 PHP를 바로 임베드하려면 PHP의 스레드 안전 버전을 사용해야합니다"라고 생각해야합니다. 그리고 이것은 올바른 생각입니다. 그러나, PHP의 스레드 안전성 에 대한 논란이 많습니다 . 그것은 당신이 정말로 무엇을하고 있는지를 정말로 알고 있다면 사용하는 땅입니다.

최종 노트

궁금한 점이 있다면, 선택권이 있다면 다중 스레드 환경에서 PHP를 사용 하지 않는 것이 좋습니다.

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

PHP의 명령 줄 버전도 살펴보면 스레드 안전성은 중요하지 않습니다.

마지막으로, 스레드 안전성이 중요하지 않은 경우 어떤 버전을 사용해야합니까? 스레드 안전성 또는 비 스레드 안전성? 솔직히 과학적 답이 없습니다! 하지만 스레드 안전이 아닌 버전이 더 빠르고 버그가 적거나 그렇지 않으면 스레드 안전 버전을 제공하고 우리에게 선택권을주지 않았을 것입니다!


나에게는 항상 nginx를 사용하거나 명령 줄에서 PHP를 실행하기 때문에 스레드 안전이 아닌 버전을 선택합니다 .

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

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


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

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

리눅스

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

PHP-FPM + APC

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


당으로 PHP 문서 ,

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

스레드 안전성은 바이너리가 Windows의 Apache 2와 같은 다중 스레드 웹 서버 컨텍스트에서 작동 할 수 있음을 의미합니다. 스레드 안전성은 각 스레드에서 로컬 저장소 복사본을 생성하여 작동하므로 데이터가 다른 스레드와 충돌하지 않습니다.

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

Following Libraries are not thread safe. They are not recommended for use in a multi-threaded environment.

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

참고URL : https://stackoverflow.com/questions/1623914/what-is-thread-safe-or-non-thread-safe-in-php

반응형