>  기사  >  백엔드 개발  >  PHP의 구성과 라이프사이클은 어떻게 되나요?

PHP의 구성과 라이프사이클은 어떻게 되나요?

慕斯
慕斯앞으로
2021-06-23 14:02:152715검색

우리는 PHP에 대해 많은 것을 배웠습니다. PHP의 구성과 수명주기를 완전히 이해했는지 궁금합니다. 그렇지 않다면 이 기사를 따라 계속 학습하십시오.

1. PHP 오픈 소스 코드 다운로드 주소:

https://github.com/php/php-src.git

2. PHP의 구조

1. 디렉토리 구조

2. 디렉토리는 PHP의 애플리케이션 인터페이스 계층입니다.

(2) Main은 PHP의 주요 코드이며 주로 입출력, 웹 통신, PHP 프레임워크의 초기화 작업 등 fastcgi 프로토콜 구문 분석, 확장 로딩, PHP 구성 구문 분석 및 기타 작업이 여기에서 완료됩니다.

(3) Zend 디렉토리는 PHP 파서, 즉 PHP 언어의 핵심 구현인 ZendVM의 주요 구현입니다. PHP 코드의 해석과 실행은 Zend에 의해 완료됩니다.

(4) ext 디렉토리는 PHP의 컬 확장, gd 라이브러리 확장, pdo 확장 등과 같은 PHP의 확장 디렉토리입니다.

(5) TSRM 디렉터리는 스레드 안전과 관련된 구현입니다.

(6) PHP의 다양한 구성 요소 간의 관계 다이어그램:

3, SAPI

(1) PHP는 스크립트 구문 분석 및 실행을 제공하는 스크립트 파서입니다. 입력은 일반 텍스트이며 사전 정의된 문법 규칙에 따라 PHP 파서에 의해 구문 분석되고 실행됩니다. 이 파서를 명령줄, 웹 환경 등 다양한 환경에 적용하고 다른 애플리케이션에 내장할 수 있습니다. 이를 위해 PHP는 다양한 애플리케이션 환경에 적응할 수 있는 SAPI 계층을 제공합니다. SAPI는 PHP의 호스트 환경으로 간주될 수 있습니다.

(2) SAPI는 전체 PHP 프레임워크의 가장 바깥쪽 부분이기도 하며 주로 PHP 프레임워크의 초기화를 담당합니다. SAPI 코드는 PHP 소스 코드의 /sapi 디렉토리에 있습니다. 자주 사용되는 SAPI는 Cli와 Fpm입니다.

4. ZendVM

(1) ZendVM은 PHP 애플리케이션과 실제 컴퓨터 사이에 있는 가상 컴퓨터입니다. ZendVM은 PHP 언어의 핵심 구현입니다. 주로 컴파일러와 실행기의 두 부분으로 구성됩니다.

(2) 컴파일러는 PHP를 실행자가 인식할 수 있는 명령어로 해석하는 역할을 담당하고, 실행자는 컴파일러가 해석한 명령어를 실행하는 역할을 담당합니다.

(3) ZendVM의 역할은 Java의 JVM과 동일합니다. 둘 다 추상화된 가상 컴퓨터입니다.

5. Extension

(1) Extension은 PHP 기능을 확장하기 위해 PHP 커널에서 제공하는 방법 집합으로, PHP 커뮤니티에는 PHP에 대한 많은 실용적인 기능을 제공하는 다양한 확장 기능이 있습니다. . , PHP의 많은 작동 기능은 확장을 통해 제공됩니다.

(2) 확장을 통해 C/C++를 사용하여 더 강력한 기능과 더 높은 성능을 얻을 수 있습니다. 확장은 PHP 확장과 Zend 확장으로 나누어지며, Zend 확장은 주로 ZendVM에서 사용됩니다.

3. PHP 생명주기

1. PHP의 전체 생명주기는 다음과 같은 단계로 나누어집니다.

(1) 모듈 초기화 단계(모듈 시작)

(2) 요청 초기화 단계(요청 시작)

(3) 스크립트 실행 단계(스크립트 실행)

(4) 종료 요청 단계( 종료 요청)

(5) 모듈 종료 단계(모듈 종료)

참고: 다른 SAPI 구현에 따라 실행이 달라집니다. 각 단계마다 상황에 따라 약간의 차이가 있습니다. 예를 들어 명령줄 모드에서는 스크립트가 실행될 때마다 이러한 단계를 거치게 됩니다. FastCgi 모드에서는 모듈 초기화가 시작 시 한 번 수행되며, 이후 각 요청은 요청 초기화, 스크립트 실행, 요청 닫기 단계만 거치게 됩니다. SAPI가 닫히면 모듈 닫기 단계만 거치게 됩니다.

2. 모듈 초기화 단계 - 분석

(1) 이 단계에서는 주로 PHP 프레임워크와 Zend 엔진의 초기화 작업을 수행합니다. 이 단계의 진입 함수는 php_module_startup()입니다. 이 단계는 일반적으로 SAPI가 시작될 때 한 번만 실행됩니다. Fpm의 경우 Fpm의 마스터 프로세스가 시작될 때 실행됩니다.

(2) 이 단계의 몇 가지 주요 프로세스는 다음과 같습니다.

(3) SAPI 활성화: sapi_activate(), 요청 정보 SG(request_info) 초기화, POST 요청을 읽기 위한 핸들 설정 등

(4) PHP 출력 시작: php_output_startup()

(5) 가비지 수집기 초기화: gc_globals_ctor() 및 zend_gc_globals 메모리를 할당합니다. (6) ZEND 엔진을 시작합니다: zend_startup().

(6.2) zend_error_cb, zend_pringf, zend_write 등과 같은 일부 유틸리티 함수 핸들을 설정합니다.

(6.3) Zend 가상 머신 컴파일 및 실행기 함수 핸들 zend_compile_file, zend_execute_ex 및 가비지 수집 함수 핸들 설정 gc_collect_cycles

(6.4) 함수 기호 테이블, 메서드 기호 테이블(function_table), 클래스 기호 테이블(class_table) 및 상수 기호 테이블(zend_constants) 등이 멀티 스레드인 경우 컴파일러 및 실행기의 전역 변수도 할당됩니다.

(6.5) Zend 핵심 확장 등록: zend_startup_builtin_funtions(). 이 확장은 커널에서 제공되는 strlen, Define, func_get_args, class_exists 등과 같은 Zend 핵심 확장 기능을 등록합니다.

(6.6) Zend에서 정의한 표준 상수(zend_register_standard_constants())를 등록합니다(예: E_ERROR, E_WARNING, E_ALL, TRUE, FALSE 등).

(6.7) $GLOBALS 슈퍼 전역 변수의 획득 핸들을 등록합니다.

(6.8) php.ini에 구성된 스토리지 심볼 테이블 EG(ini_directives)를 할당합니다.

(7) PHP에서 정의한 상수(PHP_VERSION, PHP_ZTS, PHP_SAPI 등)를 등록합니다.

(8) php.ini 구문 분석: 구문 분석이 완료되면 모든 php.ini 구성이 Configuration_hash 해시 테이블에 저장됩니다.

(9) PHP 및 Zend 코어의 php.ini 구성 매핑: 구문 분석된 php.ini를 기반으로 해당 구성 값을 얻고 최종 구성을 EG(ini_directives) 해시 테이블에 삽입합니다.

(10) $_GET, $_POST, $_COOKIE, $_SERVER, $_ENV, $_REQUEST, $_FILES 변수를 얻기 위한 핸들을 등록합니다.

(11) 정적으로 컴파일된 확장을 등록합니다: php_register_internal_extensions_func().

(12) 동적으로 로드된 확장을 등록합니다: php_init_register_extensions(), php.ini에 구성된 확장을 PHP로 로드합니다.

(13) 각 확장별로 정의된 모듈 시작 후크 함수, 즉 PHP_MINIT_FUNCTION()을 통해 정의된 함수를 콜백합니다.

(14) php.ini에 비활성화된 함수와 클래스를 등록합니다: 비활성화_펀스티션, 비활성화_클래스.

3. 요청 초기화 단계 - 분석

이 단계는 모든 요청이 요청 처리 전에 거치는 단계입니다. fpm의 경우 작업자 프로세스가 요청을 수락하고 요청 데이터를 가져와 구문 분석한 후의 단계입니다. 이 단계의 처리 함수는 php_request_startup()입니다.

주요 처리는 다음과 같습니다:

(1) 출력 활성화: php_output_activate()

(2) Zend 엔진 활성화: zend_activate(), 주요 작업은

(2.1) 가비지 수집기 재설정: gc_reset()

(2.2) 컴파일러 초기화: ini_compiler()

(2.3) 실행기 초기화: ini_exexutor(), EG(function_table) 및 EG(class_table)에 대해 각각 CG(function_table) 및 CG(class_table)를 실행합니다.

(2.4) 전역 변수 기호 테이블 EG(symbol_table), 포함된 파일 기호 테이블 EG(included_files) 초기화

(2.5) 어휘 스캐너 초기화: sapi_activate()

(3) SAPI 활성화: sapi_activate()

(4 ) 요청 시작 후크 함수의 확장된 정의를 콜백합니다: zend_activate_modules()

4. 스크립트 실행 단계 - 분석

(1) 이 단계에는 PHP 코드 컴파일 및 실행의 두 가지 핵심 단계가 포함되며, 이는 또한 가장 중요합니다. Zend 엔진의 중요한 기능입니다.

(2) 컴파일 단계에서 PHP 스크립트는 PHP 소스 코드에서 추상 구문 트리로 변환한 다음 opline 명령어로 변환하는 과정을 거칩니다. 최종 생성된 opline 명령어는 Zend 엔진에서 인식할 수 있는 실행 명령어입니다. , 이러한 명령어는 실행자에 의해 실행됩니다. 이것이 PHP 코드 해석 및 실행 과정입니다. 이 단계의 진입 함수는 php_execute_script()입니다.

5. 요청 종료 단계 - 분석

(1) 이 단계에서는 출력 내용을 플러시하고, HTTP 응답 헤더를 보내고, 로컬 변수를 정리하고, 컴파일러를 닫고, 실행기를 닫습니다.

(2) 또한 이 단계에서는 각 확장 프로그램의 요청 종료 후크 기능이 다시 호출됩니다.

(3) 이 단계는 요청 초기화 단계와 반대입니다.

6. 모듈 종료 단계 - 분석

이 단계는 SAPI가 닫힐 때 실행되며 주로 리소스를 정리하고 각 PHP 모듈을 닫습니다. 각 확장 기능의 기능입니다.

추천 학습: "PHP 비디오 튜토리얼"

위 내용은 PHP의 구성과 라이프사이클은 어떻게 되나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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