2009-03-25 7 views
46
  • Linux/UNIX에서 PHP (5.2 버전)가 스레드로부터 안전합니까?
  • Apache Worker-MPM 또는 Event-MPM과 함께 사용 가능합니까?

    PHP는 스레드로부터 안전합니까?

    • 기본 바이너리 대부분의 배포판은 ZTS 사용 중지에 포함, 그래서 내가 다시 컴파일해야 할 것이다 것을 알고 있어요 : 내가 지금까지 수집

    사실은 결정적이다.

  • 이론적으로 ZTS가 활성화 된 Zend Engine (코어 PHP)은 스레드로부터 안전합니다.
  • 일부 모듈은 스레드로부터 안전하지 않을 수도 있지만 모듈 목록을 찾지 못했습니다.
  • PHP FAQ은 위와 거의 동일합니다.

귀하의 경험은 무엇입니까?

segmentation faults (Windows 명명법의 "액세스 위반")뿐 아니라 thread safety에는 더 많은 것이 있습니다.

+1

이것은 중요한 주제이지만 매우 좋은 질문입니다. 뭔가가 있거나 스레드로부터 안전하지 않습니다. '중간 어딘가에'여기에서 토론 할 좋은 주제입니다. –

+0

공식 PHP 경고 : "[Apache 2를 사용하는 프로덕션에서 스레드 MPM을 사용하지 않는 것이 좋습니다] (http://web.archive.org/web/20160412170643/http://www.php.net/manual/ en/install.unix.apache2.php) * ". 관련 항목 : http://web.archive.org/web/20160412171006/https://docs.newrelic.com/docs/agents/php-agent/troubleshooting/threaded-apache-worker-mpms – Pacerier

답변

20

gettext를 알고 set_locale은 스레드 세이프가 아닙니다. PHP는 스레드 된 MPM과 함께 사용하면 안됩니다.

PHP Isn't Thread-Safe Yet.
Running PHP not threaded.

+0

예, 전에 그 기사를 읽으십시오. 그러나 그것은 많은 사실을주지 않습니다. 또한 segfaults (또는 "액세스 위반")은 스레드 안전성과 관련이 없습니다. – vartec

+2

예. 공유 변수에 대한 잘못된 스레드 액세스로 인해 segfault가 메모리 액세스 위반의 결과 인 경우, 이는 정확히 피하려는 사용자의 문제입니다. segfaults/access violations에 관한 것뿐만 아니라 세그 폴트 (segfault)를 수행하면 스레드 안전이 보장되지 않기 때문에 더 이상 신경 쓰지 않아도됩니다. –

+0

예.스레드 안전하지 않은 gettext 때문에 php-fpm으로 nginx를 사용하고 있습니다 : http://stackoverflow.com/questions/1646249/php-gettext-problems-like-non-thread-safe/6726570#6726570 – Stann

5

더 나은 질문은 "MPM이 사용되는 경우 다음 PHP 코드가 액세스 위반을 트리거합니까?"입니다. 또는 "다음과 같은 함수를 사용하여 동시성 문제가 발생할 가능성이있는 이상한 행동을 경험 했습니까?"

그렇지 않으면 러시아어 룰렛입니다. 패키지 된 응용 프로그램을 사용하고 있다면 지금은 정상적으로 작동 할 수 있지만 새 버전의 응용 프로그램이 나올 때부터 한 달이 지나면 중단됩니다.

일반적으로 PHP와 함께 MPM을 사용하지 말 것을 강력히 권장합니다. 그러나 실행할 작은 코드가 있으면 게시 할 수 있으며 함정에 빠지면 알려줄 수 있습니다.

+2

실제로 코드는 스레드로부터 안전하지 않으며 segfault/access 위반을 일으키지 않습니다. – vartec

+0

@vartec, 네, 제 대답을 편집했습니다. –

+1

@TimPost, 나는 왜 당신이 "러시아 룰렛"이라고 말하는지 이해하지 못합니다. 코드가 실제로 스레드로부터 안전하다면, 호출하는 동시 스레드 수에 관계없이 ** 사용하는 것이 안전합니다. "러시아어 룰렛"에서 불행한 경우에도 (동시 스레드가 모든 단계와 모든 가능한 최악의 장소에서 인터리브하는 것을 의미한다고 가정), 코드가 스레드 안전성이 있고 우리가 segfault를 얻지 못한다면 여전히 안전합니다. . – Pacerier

6

thread-safe 및 nonthread-safe 확장자 (*는 thread-safe가 아니며 다른 것들은 thread-safe) 목록을 보려면 Where can I get libraries needed to compile some of the optional PHP extensions?을 참조하십시오.

+0

이 목록은 확장 프로그램에서 작동하지만 ** non ** - extensions의 스레드 안전하지 않은 기능은 나열하지 않습니다. 위의 userOIS에서 언급 한대로 ['setlocale'] (http://php.net/manual/en/function.setlocale.php#refsect1-function.setlocale-notes) – Pacerier

관련 문제