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

CGI 및 FastCGI의 PHP7 커널 분석

藏色散人
藏色散人앞으로
2019-04-02 10:52:372285검색

CGI: 웹 서버와 웹 애플리케이션 간의 데이터 교환을 위한 프로토콜입니다. CGI:是 Web Server 与 Web Application 之间数据交换的一种协议。

FastCGI:同 CGI,是一种通信协议,但比 CGI 在效率上做了一些优化。

PHP-CGI:是 PHP (Web Application)对 Web Server 提供的 CGI 协议的接口程序。

PHP-FPM

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

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

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

작업 흐름

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이 시작될 때 작업자를 미리 생성하지 않기 때문입니다. 요청이 있는 경우에만 하위 프로세스가 생성됩니다. , 요청이 도착하면 마스터 프로세스에 알려야 합니다

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

성명:
이 기사는 segmentfault.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제