>  기사  >  백엔드 개발  >  PHP7 소스 코드의 전체 프레임워크에 대한 자세한 설명

PHP7 소스 코드의 전체 프레임워크에 대한 자세한 설명

coldplay.xixi
coldplay.xixi원래의
2021-02-03 10:18:472442검색

PHP7 소스 코드의 전체 프레임워크에 대한 자세한 설명

권장(무료): PHP7

1. PHP7 언어 실행 원리

일반적으로 사용되는 고급 언어는 많이 있는데, 사용 방법에 따라 대략 두 가지 유형으로 나눌 수 있습니다. 컴파일형 언어와 통역 언어로 실행됩니다.

컴파일이란 응용 소스 프로그램이 실행되기 전에 프로그램 소스 코드를 어셈블리 언어로 '번역'한 후, 소프트웨어 및 하드웨어 환경에 따라 추가로 타겟 파일로 컴파일하는 것을 말합니다. 컴파일 작업을 완료하는 도구를 일반적으로 컴파일러라고 합니다.

통역된 언어는 프로그램이 실행될 때 기계어로 "번역"됩니다. 그러나 "번역"은 한 번만 수행되므로 실행 효율성이 낮습니다. interpreter의 임무는 소스 코드를 해석된 언어로 "번역"하는 프로그램입니다.

C 언어 코드의 경우 실행 가능한 바이너리 파일이 되기 전에 사전 컴파일, 컴파일, 어셈블링 및 링크가 필요합니다.

C 언어로 대표되는 컴파일된 언어, 코드 업데이트는 위의 단계를 거쳐야 합니다.

컴파일된 언어의 실행 다이어그램:

컴파일된 언어와 해석된 언어의 차이점에 대한 이해는 소스 코드가 대상 플랫폼의 CPU 명령으로 컴파일되는 타이밍을 기반으로 합니다. 컴파일된 언어의 경우 컴파일 결과는 이미 해석된 언어에 대한 현재 CPU 시스템에 대한 명령이므로 먼저 중간 코드로 컴파일한 다음 해석된 언어의 특정 가상 머신을 통해 특정 CPU 시스템에 대한 명령으로 변환해야 합니다. 실행. 해석된 언어는 실행 중에 대상 플랫폼에 대한 명령으로 번역됩니다. 통역 언어는 종종 "느리다"고 말하는데, 이것이 주로 느린 이유입니다.

PHP 7에서는 먼저 소스 코드를 어휘 분석하고 소스 코드를 여러 문자열 단위로 잘라냅니다. 각각의 독립된 토큰은 완전한 의미를 표현할 수 없습니다. 토큰을 추상 구문 트리(AST)로 변환하려면 구문 분석 단계를 거쳐야 합니다. 이후 추상 구문 트리는 실행을 위해 기계 명령어로 변환됩니다. PHP에서는 이러한 명령어를 opcode라고 합니다.

1단계: 소스 코드의 어휘 분석을 통해 토큰을 얻습니다.

2단계: 구문 분석기를 기반으로 추상 구문 트리(AST)를 생성합니다.

3단계: 추상 구문 트리가 opcode(opcode 명령어 세트)로 변환되고, PHP가 opcode를 해석하고 실행합니다.

1. 토큰

토큰은 PHP 코드를 잘라낸 의미 있는 식별자입니다. PHP는 PHP 코드가 잘린 후 토큰을 얻기 위해 token_get_all() 함수를 제공합니다.

2차원 배열의 각 멤버 배열의 첫 번째 값은 Token에 해당하는 열거형 값입니다. 두 번째 값은 토큰에 해당하는 원래 문자열 콘텐츠입니다. 세 번째 값은 코드에 해당하는 줄 번호입니다.

토큰은 하나씩 "덩어리"라고 볼 수 있지만, 단독으로 존재하는 덩어리로는 완전한 의미를 표현할 수 없으며, 규칙의 도움을 받아 정리하고 연결해야 합니다. 파서는 이 조직자입니다. 구문을 확인하고, 토큰을 일치시키고, 토큰을 연결합니다.

2.AST

AST는 PHP 7 버전의 새로운 기능입니다. 이전 버전에서는 PHP 코드 실행 중에 AST를 생성하는 단계가 없었습니다.

AST 노드는 PHP 구문에 따라 여러 유형으로 구분됩니다.

PHP-Parser 도구는 PHP 코드로 생성된 AST를 보는 데 사용할 수 있습니다.

참고: PHP-Parser는 PHP 7 커널 작성자 중 한 명인 Nikic이 PHP 소스 코드에서 AST를 생성하기 위해 작성한 도구입니다. 소스 코드는 https://github.com/nikic/PHP-Parser에서 확인할 수 있습니다.

3.opcodes

opcode는 단일 명령어일 뿐입니다. opcode는 opcode 모음이며 PHP 실행 중 중간 코드입니다. opcode가 생성된 후 가상 머신에 의해 실행됩니다.

가장 일반적인 PHP 엔지니어링 최적화 조치 중 하나는 여기에서 opcode 캐시를 가리키는 "opcache 켜기"입니다. 소스 코드에서 opcode까지의 단계를 제거함으로써 엔진은 캐시된 opcode를 직접 실행할 수 있으므로

성능이 향상됩니다.

vld 플러그인을 사용하면 PHP 코드 조각으로 생성된 opcode를 직관적으로 볼 수 있습니다.

opcode는 PHP 7에서 정의한 명령어 식별자 집합이며 명령어는 해당 핸들러(처리 함수)에 해당합니다. 가상 머신이 opcode를 호출하면 opcode 뒤의 처리 기능을 찾아 실제 처리를 수행합니다.

2. 커널 아키텍처

Zend 엔진에는 컴파일러와 인터프리터가 포함되어 있습니다. PHP 코드부터 opcode 실행까지 모두 Zend 엔진에 의해 완료됩니다.

Zend 엔진은 PHP의 핵심 기능을 구현하는 것 외에도 명령줄 환경, 웹 환경 등 더 많은 시나리오에서 PHP를 사용할 수 있는 인터페이스 세트도 제공합니다.

아키텍처 다이어그램은 대략 네 부분으로 나뉩니다.

1) Zend 엔진: 위에서 소개한 어휘/문법 분석, AST 컴파일, opcode 실행 등이 모두 Zend 엔진에서 구현됩니다. 또한 PHP의 변수 설계, 메모리 관리, 프로세스 관리 등도 엔진 레이어에서 구현됩니다. 엔진은 PHP에 대한 기본 서비스를 제공합니다. PHP의 안정성과 고성능은 엔진의 기본 지원에 달려 있습니다. 동시에 Zend 엔진의 확장성은 PHP가 대규모로 응용되는 중요한 이유 중 하나입니다.

2) PHP 레이어: Zend 엔진은 PHP에 대한 기본 기능(예: 메모리 할당 및 재활용)을 제공하는 반면, 외부와의 상호 작용은 PHP 레이어를 통해 처리해야 합니다.

3) SAPI: SAPI는 Server API의 약어로, 일반적인 cli SAPI 및 fpm SAPI를 포함합니다. PHP는 입출력 사양을 정의하고, 이 사양에 따라 PHP와 상호 작용하는 당사자를 서버라고 할 수 있습니다.

4) Extension 부분: Zend 엔진은 핵심 기능과 인터페이스 사양을 제공합니다. 이를 기반으로 개발된 확장은 PHP 코드의 성능과 기능적 다양성을 위한 보다 풍부한 옵션을 제공합니다.

3. PHP 소스 코드 디렉터리

sapi 디렉터리 소스 코드

sapi 디렉터리는 입력 및 출력 레이어를 추상화한 것이며, PHP가 외부 서비스를 제공하기 위한 사양입니다.

PHP 프로그램에 대한 입력은 명령줄의 표준 입력이거나 cgi/fastcgi 프로토콜 기반 네트워크 요청일 수 있습니다. 같은 방식으로 출력은 명령줄의 표준 출력에 기록되거나 cgi/fastcgi 프로토콜을 기반으로 하는 네트워크 응답으로 클라이언트에 반환될 수 있습니다.

명령줄 모드는 바이너리 프로그램 bin/php에 해당합니다. 내장 모듈 모드는 바이너리 프로그램을 제공할 필요가 없으며 Apache 또는 C/C++ 프로그램에서 일반 함수로 호출할 수 있습니다. 바이너리 프로그램 bin/cgi에 해당합니다. FastCGI 모드는 바이너리 프로그램 sbin/php-fpm에 해당합니다.

일반적으로 사용되는 여러 SAPI입니다.

1) apache2handler: Apache 확장 프로그램은 동적 링크 라이브러리를 생성하기 위해 컴파일되었으며 Apache에 대한 http 요청이 있을 때 구성에 따라 이 동적 링크 라이브러리가 호출되고 PHP 코드를 실행하며 다음과 완전한 상호 작용을 수행합니다. PHP.

2) cgi-fcgi: 컴파일 후 CGI 프로토콜을 지원하는 실행 가능한 프로그램이 생성됩니다. 웹 서버(보통 Apache 또는 Nginx)는 CGI 프로토콜을 통해 요청을 CGI 프로세스에 전달하고 실행 코드는 결과를 반환합니다. 웹서버를 종료하고 프로세스를 종료합니다.

3) fpm-fcgi: fpm은 FastCGI Process Manager의 약자로, PHP에서 공식적으로 제공하는 FastCGI 프로세스 관리자입니다. Nginx 서버를 예로 들면, http 프로토콜 요청이 Nginx 서버로 전송되면 Nginx는 FastCGI 프로토콜에 따라 처리하기 위해 해당 요청을 php-fpm 프로세스로 전달합니다.

4) cli: PHP의 명령줄 대화형 인터페이스인 Command Line Interface의 약자입니다.

Zend 디렉터리 소스 코드

Zend 디렉터리는 PHP의 핵심 코드입니다.

1. 메모리 관리 모듈

2. 가비지 컬렉션

3. 어레이 구현

메인 디렉토리 소스 코드

메인 디렉토리는 SAPI 레이어와 Zend 레이어를 연결하는 역할을 합니다.

Zend 레이어는 PHP 스크립트의 컴파일 및 실행을 구현하고, sapi 레이어는 입력 및 출력의 추상화를 구현하며, 메인 디렉터리는 이전 디렉터리와 다음 디렉터리 사이의 링크 역할을 합니다. 이전 디렉터리 연결, SAPI 요청 구문 분석, 분석 실행할 스크립트 파일 및 매개변수 다음으로 Zend 엔진을 호출하기 전에 필요한 초기화 및 기타 작업을 완료합니다.

ext 디렉터리 소스 코드

ext는 PHP 확장과 관련된 디렉터리이며, 일반적으로 사용되는 배열, str, pdo 및 기타 일련의 함수가 여기에 정의되어 있습니다.

TSRM 디렉토리 소스 코드

초기에는 PHP가 단일 프로세스 및 단일 스레드 모델에서 더 많이 실행되었습니다. 후기에만 스레드 안전 메커니즘 ZTS(Zend Thread Safety)가 도입되었습니다.

TSRM은 Thread Safe Resource Manager - Thread Safe Resource Manager의 약어입니다.

스레드 안전 메커니즘은 주로 공유 리소스의 보안을 보장하는 것입니다. PHP의 스레드 안전 메커니즘은 간단하고 직관적입니다. 멀티 스레드 환경에서 각 스레드에는 전역 변수의 독립적인 복사본이 제공됩니다. 구체적인 구현은 TSRM을 통해 각 스레드에 독립적인 ID(자동 증가)를 현재 스레드의 전역 변수 메모리 영역 인덱스로 할당(할당 전 잠금)하는 것입니다. 향후 전역 변수 액세스에서는 스레드 간의 완전한 독립이 달성됩니다.

위 내용은 PHP7 소스 코드의 전체 프레임워크에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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