말씀하신 대로 자세한 이유를 말씀해 주실 수 있나요?
말씀하신 대로 자세한 이유를 말씀해 주실 수 있나요?
우리가 일반적으로 이야기하는 대부분의 동시성은 php 대신
apache nginx와 같은 서비스를 위한 것입니다
또한 php는 멀티스레드이지만 일일 프로젝트에서는 사용되지 않습니다
Thread를 확장하는 다중 스레드 클래스 정의
사실 이 문장 자체가 모호합니다.
먼저 전제조건을 살펴보세요:
<code>php不支持多线程 </code>
PHP 언어 코드 자체는(대부분의 경우) 다중 프로세스인지 다중 스레드인지 상관하지 않습니다. 그러나 이는 PHP가 멀티스레딩/멀티프로세싱을 지원하지 않는다는 의미는 아닙니다. php-fpm은 다중 프로세스 및 단일 스레드이고 apeche의 다중 스레드 모드는 다중 스레드입니다. PHP는 일반적으로 PHP 코드 수준에서 직접 프로세스나 스레드를 제어하지 않습니다.
<code>不用考虑并发问题 </code>
전제가 확립되지 않으면 결론은 인과관계가 없습니다.
저는 이 말을 한 사람의 원래 의도를 이해합니다. PHP는 일반적으로 프로세스 및 스레드 제어를 지원하지 않기 때문에 동시성 문제를 처리하기 위해 코드를 통해 프로세스 및 스레드를 직접 제어하지 않습니다.
그렇게 말해도 틀린 말은 없습니다.
그러나 동시성 문제는 여전히 동시성 문제입니다. 단지 PHP 코드 자체가 동시성 문제 해결을 지원하지 않기 때문에 동시성 문제는 존재하지 않습니다.
PHP 동시성 문제를 해결하는 기존 방법은 다양한 구성 조정(nginx.conf, php-fpm.ini, php.ini)과 로드 밸런싱을 통한 것입니다. PHP 코드는 아니지만, PHPer로서 마스터해야 할 PHP와 밀접한 관련이 있는 것입니다.
또한 특정 비즈니스 유형에 맞게 PHP 로직을 수정할 수 있으며 프런트엔드 호출 로직도 사용할 수 있습니다. php-fpm을 완전히 버리고 기본적으로 PHP에서 비동기 동시성을 지원하는 swoole과 같은 확장도 있습니다(그러나 여전히 단일 스레드입니다). 이러한 동시성 최적화 방법은 특정 비즈니스를 기반으로 선택해야 합니다.
틀렸어, 틀렸어!
PHP는 멀티스레딩을 지원하지 않지만 명령줄 프로그램의 백그라운드 작업이나 웹 애플리케이션의 php-fpm은 여러 프로세스에서 동시에 처리될 수 있으므로 동시성 문제를 피할 수 없습니다. 하나의 재고, 둘 동시에 여러 동시 요청이 들어올 때 주문이 초과 판매되지 않도록 어떻게 보장합니까?
멀티스레딩을 고려하지 않더라도 동시성은 여전히 존재하며 이를 해결하기가 더 어렵습니다.
동시성은 멀티스레딩만 가능합니까? 너무 좁습니다
PHP는 기본적으로 멀티스레딩을 지원하므로 스레드 안전성과 비스레드 안전성에는 차이가 있습니다.
PHP 멀티스레드 확장에 대해서는 다음을 참조하세요.
https://pecl.php.net/ package/pthreads
이 확장은 일반적으로 cli에서 스크립트 프로그래밍에 사용되는 실제 PHP 다중 스레드 프로그래밍 지원을 제공합니다.
또한 Foreigner Feng은 PHP 확장을 통한 고성능 개발을 지원하기 위해 비동기 다중 스레드 아키텍처도 개발했습니다. 실시간 네트워크 서비스 Swoole의 소개:
https://pecl.php.net/package/swoole
Swoole의 멀티스레딩은 프로그래머가 신경 쓸 필요가 없으며 일련의 아키텍처와 비슷합니다. 구성이 필요하며 Swoole은 일반적으로 cli에서 스크립트 프로그래밍에 사용됩니다.
예를 들어, Nginx와 함께 자주 사용되는 PHP FastCGI 서비스 PHP-FPM은 다중 프로세스를 사용하여 동시성에 대한 멀티 코어 응답을 구현합니다. 이는 PHP-FPM이 프로세스 풀 설정을 지원하고 정적 지원을 사용하는 Apache와 유사합니다. 및 동적 프로세스 번호 설정은 자연스럽고 투명한 "데이터베이스 연결 풀"(영구 연결)을 지원합니다.
MOD_PHP는 이벤트 MPM을 사용하여 Apache를 실행할 때 다중 스레드 상태에서도 작동합니다. Apache 이벤트 MPM은 PHP가 사용해야 하는 스레드 안전 버전인 다중 프로세스 다중 스레드 이벤트 기반 MPM이기 때문입니다.