>  기사  >  백엔드 개발  >  PHP7 커널 분석 1 CGI 및 FastCGI

PHP7 커널 분석 1 CGI 및 FastCGI

不言
不言원래의
2018-04-13 14:46:092429검색

이 글의 내용은 PHP7 Kernel Analysis 1의 CGI와 FastCGI에 관한 내용입니다. 이제 공유합니다. 도움이 필요한 친구들이 참고할 수 있습니다.

CGI: Web Server와 Web Application 간의 데이터 교환을 위한 프로토콜입니다.
FastCGI: CGI와 동일하며 통신 프로토콜이지만 CGI보다 효율성이 일부 최적화되어 있습니다.
PHP-CGI: Web Server에서 제공하는 CGI 프로토콜에 대한 PHP(Web Application)의 인터페이스 프로그램입니다.
PHP-FPM: PHP(웹 애플리케이션)에서 웹 서버에 제공하는 FastCGI 프로토콜의 인터페이스 프로그램입니다. 또한 클라이언트가 요청하는 경우 비교적 지능적인 작업 관리

CGI 워크플로

1도 제공합니다. index.html을 사용하면 웹 서버는 파일 시스템에서 이 파일을 찾아 브라우저로 보냅니다. 여기에 배포되는 것은 정적 데이터입니다.

2. 웹 서버는 index.php 요청을 받으면 PHP 파서인 해당 CGI 프로그램을 시작합니다. 다음으로 PHP 파서는 php.ini 파일을 구문 분석하고 실행 환경을 초기화한 다음 요청을 처리하고 처리된 결과를 CGI에서 지정한 형식으로 반환하고 프로세스를 종료하며 웹 서버는 결과를 브라우저에 반환합니다.

FastCGI 워크플로

1. 클라이언트가 index.html을 요청하면 웹 서버는 파일 시스템에서 이 파일을 찾아 브라우저로 보냅니다. 여기에 배포되는 것은 정적 데이터입니다.

2. 웹 서버가 index.php 요청을 받으면 FastCGI 프로그램(FastCGI는 시작 시 실행 환경을 초기화하고 각 CGI 프로세스 풀은 실행 환경을 공유함)이 CGI 프로세스 풀에서 CGI 프로세스를 선택하여 요청을 처리합니다. , 처리된 결과를 CGI에서 지정한 형식으로 반환하고 계속해서 다음 요청을 기다립니다.

PHP-FPM의 기본 구현

1. PHP-FPM의 구현은 마스터 프로세스를 생성하고, 마스터 프로세스에 작업자 풀을 생성하고, 소켓을 수신하도록 한 다음, 여러 하위 프로세스를 분기하는 것입니다. (작업) 이러한 하위 프로세스는 각 승인 요청을 처리하는 데 매우 간단하며, 요청이 도착하면 요청 데이터를 읽기 시작합니다. 이 기간 동안에는 다른 요청을 받지 않습니다. 즉, PHP-FPM의 하위 프로세스는 이 요청이 처리된 후에만 응답할 수 있습니다. be accept

2. PHP-FPM의 마스터 프로세스와 작업자 프로세스 사이에는 직접적인 통신이 없습니다. 마스터는 공유 메모리를 통해 작업자 프로세스의 현재 상태, 작업 프로세스에 대한 정보를 얻습니다. 처리된 요청 수 등. 마스터 프로세스가 작업자 프로세스를 종료하려고 하면 신호를 보내 작업자 프로세스에 알립니다.

3.PHP-FPM은 동시에 여러 포트를 모니터링할 수 있습니다. 각 포트는 작업자 풀에 해당하고 각 풀은 여러 작업자 프로세스에 해당합니다

PHP7 커널 분석 1 CGI 및 FastCGI

작업 흐름

1. : 작업자 프로세스는 요청을 기다리는 동안 fcgi_accept_request()에서 차단됩니다.
2. 요청 구문 분석: fastcgi 요청이 도착한 후 작업자가 이를 수신한 후 요청 데이터가 완전히 완료될 때까지 요청 데이터를 수신하고 구문 분석하기 시작합니다.
3. 요청 초기화: php_request_startup()을 실행합니다. 이 단계에서는 PHP_RINIT_FUNCTION()을 호출합니다.
4. PHP 스크립트의 컴파일 및 실행은 php_execute_script()에 의해 완료됩니다. : 요청이 완료된 후, php_request_shutdown()이 호출됩니다. 각 확장에 대해: PHP_RSHUTDOWN_FUNCTION(), 다음 요청을 기다리기 위해 단계 (1)을 입력합니다.

마스터 프로세스 관리

1.static: 이 방법은 비교적 간단합니다. 시작 시 마스터는 pm.max_children 구성에 따라 해당 수의 작업자 프로세스를 분기합니다. 즉, 작업자 프로세스 수가 고정되어 있습니다.

2.dynamic : 동적 프로세스 관리, fpm이 시작될 때 pm.start_servers에 따라 먼저 특정 수의 작업자를 초기화합니다. 작동 중에 마스터가 유휴 작업자 수가 구성된 pm.min_spare_servers 수보다 낮다는 것을 발견하면( 요청이 너무 많아 작업자가 이를 처리할 수 없음을 나타냄) 작업자 프로세스를 분기하지만 총 작업자 수는 pm.max_children을 초과할 수 없습니다. 유휴 작업자가 너무 많다는 점) 너무 많은 리소스를 점유하지 않기 위해 일부 작업자를 죽일 것입니다. 마스터가 통과합니다. 이 4가지 값은 작업자 수를 제어합니다

3.ondemand: 이 방법은 일반적으로 거의 사용되지 않습니다. 작업자 프로세스는 시작 시 할당되지 않으며, 요청이 있는 경우 작업자 프로세스를 포크하도록 마스터 프로세스에 알림이 전달됩니다. 총 작업자 수가 pm을 초과하지 않으면 처리가 완료된 후 작업자 프로세스가 즉시 종료되지 않습니다. . 유휴 시간이 pm.process_idle_timeout을 초과하면 종료됩니다.process_idle_timeout

PHP-FPM Event Manager

1.sp[1] 파이프라인 판독 가능 이벤트: 이 이벤트는 신호 처리를 위한 마스터

2.fpm_pctl_perform_idle_server_maintenance_heartbeat()입니다. 프로세스 관리 구현의 주요 이벤트입니다. 마스터는 1초마다 트리거되는 타이머를 시작합니다. 이는 주로 동적 및 주문형 모드에서 작업자 관리에 사용됩니다. 마스터는 각 작업자 풀의 작업자 프로세스 수를 확인하고 제어합니다. 이 타이머를 통과한 작업자 수

3.fpm_pctl_heartbeat(): 이 이벤트는 작업자가 단일 요청을 처리하는 데 걸리는 최대 시간을 제한하는 데 사용됩니다. php-fpm.conf에 request_terminate_timeout 구성 항목이 있습니다. 프로세스 요청이 이 값을 초과하면 마스터는 작업자 프로세스를 종료하기 위해 kill -TERM 신호를 보냅니다. 이 구성의 단위는 0입니다. 이는 이 메커니즘을 끄는 것을 의미합니다. .fpm_pctl_on_socket_accept(): 온디맨드 모드에서 마스터가 모니터링하는 새 요청 도착 이벤트입니다. 온디맨드 모드에서는 fpm이 시작될 때 작업자를 미리 생성하지 않으며 요청이 있는 경우에만 하위 프로세스가 생성됩니다. 따라서 요청이 도착하면 마스터 프로세스에 알려야 합니다

위 내용은 PHP7 커널 분석 1 CGI 및 FastCGI의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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