php-fpm은 마스터/워커(하위) 다중 프로세스 아키텍처로, nginx 디자인 스타일과 다소 유사합니다. 마스터 프로세스는 주로 CGI 및 PHP 환경 초기화, 이벤트 모니터링, 하위 프로세스 상태 등을 담당하고 작업자 프로세스는 PHP 요청 처리를 담당합니다.
작동 원리
php-fpm은 마스터/워커 프로세스 모듈의 기능을 위에서 간략하게 설명했습니다. 이 두 모듈의 작동 원리는 아래에서 자세히 설명합니다.
마스터 프로세스
마스터 프로세스 워크플로는 아래와 같이 4단계로 나뉩니다.
1. cgi 초기화 단계: 각각 fcgi_init() 및 sapi_startup() 함수를 호출하고 프로세스 신호를 등록하고 초기화합니다. sapi_globals 전역 변수.
2. PHP 환경 초기화 단계: cgi_sapi_module.startup에 의해 트리거됩니다. 실제로는 php_cgi_startup 함수가 호출되며, php_cgi_startup은 내부적으로 php_module_startup을 호출하여 실행됩니다.
php_module_startup 주요 기능:
a), PHP 구성 로드 및 구문 분석
b), PHP 모듈을 로드하고 이를 함수 기호 테이블(function_table)에 기록합니다.
c), zend 확장 로드; , 설정 비활성화 기능 및 클래스 라이브러리 구성
e), 메모리 복구 방법 등록
3. php-fpm 초기화 단계: fpm_init() 함수를 실행합니다. php-fpm.conf 파일 구성 분석, 프로세스 관련 매개변수(프로세스에서 열 수 있는 최대 파일 수 등) 획득, 프로세스 풀 및 이벤트 모델 초기화, 기타 작업을 담당합니다.
4. php-fpm 실행 단계: fpm_run() 함수를 실행하면 실행 후 메인 프로세스가 차단됩니다. 이 단계는 포크 하위 프로세스와 루프 이벤트의 두 부분으로 나뉩니다.
fork 하위 프로세스 부분은 fpm_children_create_initial 함수에 의해 처리됩니다(참고: ondemand 모드는 fpm_pctl_on_socket_accept 함수에서 생성됩니다).
루프 이벤트 부분은 내부의 무한 루프이며 이벤트 수집을 담당하는 fpm_event_loop 함수를 통해 처리됩니다.
작업자 프로세스작업자 프로세스는 클라이언트 요청 수신, 요청 처리, 요청 완료의 세 단계로 나뉩니다.
1. 클라이언트 요청 수신: accept 함수를 호출하여 내부적으로 클라이언트 요청을 얻는 fcgi_accept_request 함수를 실행합니다.
//请求锁 FCGI_LOCK(req->listen_socket); req->fd = accept(listen_socket, (struct sockaddr *)&sa, &len); //释放锁 FCGI_UNLOCK(req->listen_socket);
위 코드에서 수락하기 전에 요청 잠금 작업이 있음을 알 수 있습니다. 이는 요청의 "충격" 현상을 방지하기 위해 설계되었습니다. 물론 이는 선택사항이므로 해당 기능을 비활성화할 수 있습니다.
2. 요청 처리 단계: 먼저 fpm_request_info 및 php_request_startup을 각각 호출하여 요청 내용을 얻고 전역 변수($_GET, $_POST, $_SERVER, $_ENV, $_FILES)를 등록한 다음 php_fopen_primary_script를 호출하여 그에 따라 스크립트 파일에 액세스합니다. 요청 정보에 마지막으로 실행을 위해 php_execute_script에 남겨 둡니다. php_execute_script는 처리를 위해 스크립트를 zend 엔진에 전달하기 위해 내부적으로 zend_execute_scripts 메소드를 호출합니다.
3. 요청 종료 단계: php_request_shutdown 함수를 실행합니다. 이때, Register_shutdown_function에 의해 등록된 함수와 __destruct() 메서드가 콜백되어 응답 내용 전송, 메모리 해제 및 기타 작업을 수행합니다.
요약php-fpm은 마스터/작업자 아키텍처로 설계되었습니다. 마스터 프로세스는 CGI 및 PHP 공개 환경의 초기화 및 이벤트 모니터링 작업을 담당합니다. 작업자 프로세스는 요청 처리 기능을 담당합니다. 작업자 프로세스가 요청을 처리할 때 PHP 실행 환경을 다시 초기화할 필요가 없습니다. 이는 php-fpm의 뛰어난 성능 이유 중 하나입니다.
PHP 관련 지식을 더 알고 싶으시면
php 중국어 홈페이지위 내용은 phpfpm은 어떻게 작동하나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!