>  기사  >  백엔드 개발  >  php-fpm 작동 방식

php-fpm 작동 방식

爱喝马黛茶的安东尼
爱喝马黛茶的安东尼원래의
2019-08-28 16:23:585917검색

php-fpm 작동 방식

php-fpm은 마스터(메인)/워커(자식) 다중 프로세스 아키텍처로, nginx 디자인 스타일과 다소 유사합니다. 마스터 프로세스는 주로 CGI 및 PHP 환경 초기화, 이벤트 모니터링, 하위 프로세스 상태 등을 담당하고 작업자 프로세스는 PHP 요청 처리를 담당합니다.

작동 원리를 소개하기 전에 먼저 여러 작동 모드를 이해해 보겠습니다.

실행 모드

php-fpm은 정적, 주문형 및 동적의 세 가지 실행 모드를 지원합니다. 기본값은 동적입니다.

static: 시작 시 고정된 작업자 프로세스를 할당하는 정적 모드입니다.

ondemand: 사용자 요청이 수신되면 온디맨드, 포크 작업자 프로세스를 할당합니다.

dynamic: 시작 시 고정 프로세스를 할당하는 동적 모드입니다. 요청 횟수가 증가함에 따라 설정된 부동 범위 내에서 작업자 프로세스가 조정됩니다.

이 세 가지 모드는 각각 고유한 장점이 있으며 다양한 환경에 따라 해당 구성을 조정할 수 있습니다.

php-fpm의 작동 원리에 초점을 맞춰 이 글의 주제를 살펴보겠습니다.

관련 권장사항: "PHP 시작 튜토리얼"

작동 원리

php-fpm은 마스터/워커 프로세스 모듈의 기능을 위에서 간략하게 설명했습니다. 이 두 모듈의 작동 원리는 아래에서 자세히 설명합니다.

마스터 프로세스

마스터 프로세스 워크플로는 아래와 같이 4단계로 나뉩니다.

php-fpm 작동 방식

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 구성을 로드하고 이를 함수 기호 테이블(function_table)에 기록합니다.

d). . 비활성화 기능 및 클래스 라이브러리 구성

e) 메모리 복구 방법 등록

3. 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);
php-fpm 작동 방식위 코드에서 수락하기 전에 요청 잠금 작업이 있음을 알 수 있습니다. 이는 요청의 "충격" 현상을 방지하기 위해 설계되었습니다. 물론 이는 선택사항이므로 해당 기능을 비활성화할 수 있습니다.

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-fpm 작동 방식의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.