복붙노트

PHP에서 쓰레드 안전하거나 쓰레드 안전하지 않은 것은 무엇입니까?

PHP

PHP에서 쓰레드 안전하거나 쓰레드 안전하지 않은 것은 무엇입니까?

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

해결법

  1. ==============================

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

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

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

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

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

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

    mod_php를 사용하면 PHP가 Apache로 바로로드되기 때문에 Apache가 Worker MPM을 사용하여 (즉 스레드를 사용하여) 동시성을 처리 할 경우 PHP는 동일한 멀티 스레드 환경에서 작동 할 수 있어야합니다. 즉 PHP는 아파치로 정확하게 볼을 플레이 할 수 있도록 쓰레드에 안전하다!

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

    당신이 궁금해하는 경우에, 내 개인적인 조언은 당신이 선택의 여지가 있다면 멀티 스레드 환경에서 PHP를 사용하지 않는 것입니다!

    Unix 기반 환경에 대해서만 말하면 다행스럽게도 Apache 웹 서버에서 PHP를 사용하려는 경우이 점을 고려해야합니다.이 경우 Apache의 MPM 사전 설치 (예 : 스레드를 사용하지 않으므로 PHP 스레드 안전성은 중요하지 않습니다.) 그리고 내가 아는 모든 GNU / Linux 배포판은 패키지 시스템을 통해 Apache + PHP를 설치할 때 결정을 내리지 않고 선택을 위해서. nginx 또는 lighttpd와 같은 다른 웹 서버를 사용하려는 경우 어쨌든 PHP를 포함시킬 수있는 옵션이 없습니다. FastCGI 또는 PHP가 완전히 웹 서버 외부에있는 다른 모델에서 작동하는 동일한 기능을 사용하여 볼 수 있습니다. FastCGI. 이러한 경우 스레드 안전도 중요하지 않습니다. 웹 사이트의 버전을 확인하려면 사이트에서 서버 API 항목을 찾으십시오. CGI / FastCGI 나 Apache 2.0 Handler와 같은 것을 말할 수 있습니다.

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

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

  2. ==============================

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

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

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

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

  3. ==============================

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

    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 프로세스 관리자입니다.

  4. ==============================

    4.PHP 문서에 따라,

    PHP 문서에 따라,

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

  5. from https://stackoverflow.com/questions/1623914/what-is-thread-safe-or-non-thread-safe-in-php by cc-by-sa and MIT license