1. PHP 소스 코드 구조
PHP에는 ZE(Zend Engine)와 PHP Core라는 두 가지 핵심 하위 시스템이 있습니다.
ZE는 PHP 스크립트를 기계 코드(토큰이라고도 함)로 구문 분석하는 역할을 담당합니다. , 이러한 기계어 코드는 프로세스 공간에서 실행됩니다. ZE는 PHP 기능의 메모리 관리, 가변 범위 관리 및 스케줄링 관리도 담당합니다.
PHP Core는 SAPI 계층과의 통신을 담당합니다. PHP Core는 safe_mode 및 open_basedir 검사를 위한 통합 제어 계층도 제공합니다. PHP Core는 사용자 도메인의 파일 및 네트워크 IO 작업을 위한 스트림 계층도 제공합니다. 그중 SAPI(서버 응용 프로그래밍 인터페이스)에는 일반적으로 Nginx, Apache, IIS, CLI, CGI 및 기타 호스트 환경이 포함됩니다.
PHP 확장은 mysql, redis, memcache, sqlite 등 읽기 및 쓰기, json, xml 파일, 비누, Sokcet, 컬 네트워크 프로토콜 구문 분석과 같은 ZE 및 PHP Core를 기반으로 하는 다양한 일반 작업의 캡슐화를 제공합니다. 캡슐화, 암호화, 복호화, 압축 및 압축 해제 등, 이미지 처리 등 일부 확장은 redis 통신 프로토콜에 따라 C를 사용하여 redis와 통신하는 등 특정 기능을 처음부터 구현합니다. 일부 확장은 시스템에 설치해야 하는 이미지 처리용 gb 확장과 같이 시스템의 기존 라이브러리를 호출합니다. 해당 gd 라이브러리.
PHP 소스 코드 php-5.6.24/ext에는 78개의 확장 기능이 제공됩니다.
간단히 말하면 ZE와 PHP Core는 기본 아키텍처를 제공하고, EXT(확장)는 사용자 도메인에서 다양한 작업을 제공합니다.
php-5.6.24 소스 코드를 예로 들면, ZE는 php-5.6.24/Zend 폴더에 해당하고, PHP Core는 php-5.6.24/main 폴더에 해당하고, 확장자는 php 폴더에 해당합니다. -5.6.24/내선
2. PHP 확장의 수명 주기
PHP는 SAPI 명령을 수신하면 먼저 커널 하위 시스템을 초기화하고 시작합니다. 커널 하위 시스템 시작이 끝나면 PHP는 해당 명령을 로드하기 시작합니다. 확장 코드는 확장을 초기화하며, 이 시점에서 PHP는 각 모듈의 모듈 초기화 루틴(MINIT)을 호출합니다.
MINIT(모듈 초기화)
PHP는 MINIT 관련 루틴을 호출하여 각 확장에 내부 변수를 초기화하고, 리소스를 할당하고, 리소스 처리 핸들을 등록하고, 스크립트를 용이하게 하기 위해 ZE에 자체 함수를 등록할 수 있는 기회를 제공합니다. 이 함수 중 하나를 통해 ZE는 어떤 코드를 실행할지 알고 있습니다.
RINIT(요청 초기화)
모듈 초기화가 완료된 후 PHP는 SAPI 요청을 받은 후 ZE가 현재를 설정합니다. 요청된 PHP 스크립트는 실행 환경을 생성하고 각 확장의 RINIT(요청 초기화) 기능을 호출하여 각 확장에 특정 환경 변수를 설정하고, 요청에 따라 리소스를 할당하거나, 감사와 같은 다른 작업을 수행할 수 있는 기회를 제공합니다.
여기에 언급된 SAPI 요청은 두 가지 범주로 나뉩니다. 하나는 Apache, IIS 및 기타 성숙한 웹 서버 SAPI입니다. 시작되면 PHP는 먼저 MINIT를 실행한 다음 사용자의 페이지 요청을 기다립니다. SAPI 요청의 또 다른 유형은 CGI 또는 CLI SAPI입니다. PHP는 이러한 유형의 SAPI 요청을 받으면 MINIT를 실행한 후 즉시 RINIT를 실행합니다.
RINIT 요청이 초기화되면 ZE는 제어권을 되찾고 현재 요청된 스크립트를 토큰으로 변환합니다. 이는 궁극적으로 opcode(작업 코드)를 구성합니다. opcode가 특정 실행을 요구하는 경우. 확장 기능은 ZE가 관련 매개변수를 수정된 기능에 바인딩하고 기능이 실행될 때까지 일시적으로 제어권을 해당 기능에 넘겨주는 것을 의미합니다.
RSHUTDOWN(종료 요청)
PHP 스크립트가 실행된 후 PHP는 각 확장 요청 종료(RSHUTDOWN) 함수를 호출하여 최종 정리 작업(예: 세션 변수를 디스크에 저장)을 수행합니다. 다음으로 ZE는 정리 프로세스(가비지 수집)를 수행하여 이전 요청 중에 사용된 모든 변수를 효과적으로 unset()합니다.
MSHUTDOWN(모듈 종료)
RSHUTDOWN이 완료되면 PHP는 SAPI의 다른 문서 요청이나 종료 신호를 계속 기다립니다. CGI 및 CLI와 같은 SAPI의 경우 "다음 요청"이 없으므로 SAPI가 즉시 종료되기 시작합니다. 종료 중에 PHP는 다시 각 확장을 반복하고 모듈 종료(MSHUTDOWN) 함수를 호출한 다음 결국 자체 커널 하위 시스템을 종료합니다.
GINIT
전역 변수 초기화
GSHUTDOWN
전역 변수 해제
MINFO
phpinfo 모듈의 정보를 설정합니다. phpinfo는 구성을 레벨링해야 합니다. 각 확장 정보
// main/php.h #define PHP_MINIT ZEND_MODULE_STARTUP_N #define PHP_MSHUTDOWN ZEND_MODULE_SHUTDOWN_N #define PHP_RINIT ZEND_MODULE_ACTIVATE_N #define PHP_RSHUTDOWN ZEND_MODULE_DEACTIVATE_N #define PHP_MINFO ZEND_MODULE_INFO_N #define PHP_GINIT ZEND_GINIT #define PHP_GSHUTDOWN ZEND_GSHUTDOWN #define PHP_MINIT_FUNCTION ZEND_MODULE_STARTUP_D #define PHP_MSHUTDOWN_FUNCTION ZEND_MODULE_SHUTDOWN_D #define PHP_RINIT_FUNCTION ZEND_MODULE_ACTIVATE_D #define PHP_RSHUTDOWN_FUNCTION ZEND_MODULE_DEACTIVATE_D #define PHP_MINFO_FUNCTION ZEND_MODULE_INFO_D #define PHP_GINIT_FUNCTION ZEND_GINIT_FUNCTION #define PHP_GSHUTDOWN_FUNCTION ZEND_GSHUTDOWN_FUNCTION
3. PHP 확장 메모리 관리
ZE는 자체 내부 메모리 관리를 수행할 때 특정 메모리가 변수는 지속성입니다. ZE는 비영구적 메모리를 정리합니다. 하지만 비영구 메모리는 확장 내에서 직접 정리하는 것이 가장 좋습니다. 확장 자체에서 할당한 비영구 메모리는 오랫동안 재활용되지 않은 상태로 남아 있어 이와 관련된 리소스가 오랫동안 해제되지 않기 때문입니다. 시간.