PHP 밑바닥을 탐구하다
1、PHP란 무엇인가?
PHP는 나를 가리킨다밖에서 보던 세트 다 끝나고정밀한 시스템. 약간 혼란스럽게 들리지만 복잡하지는 않습니다(PHP4 내부 구조도).기능별로 나누면: 우리는 세 부분으로 나눌 수 있다:
1, 인터프리터 부분(엔진으로)입력코드의 분석, 번역 및 실행을 담당한다.
2, 기능적인 부분(PHP 기능함수 및확장), 구현 언어의 다양한 기능(예를 들어, 그것의 함수 등)을 담당한다.
3, 인터페이스 부분(SAPI), 책임 동일 WEB 서버의 세션 등의 기능.
Zend가 포함되다일부의 전부와 2부PHP 커널은 부분적으로는 부분적으로는 부분적으로는 부분적으로는 부분적으로는 부분적으로는 부분적으로는 부분적으로는 부분적으로는 부분적으로는 모두 포함한다.이들을 합치면 PHP 가방이라고 한다.Zend는 언어의 핵심을 이루면서 동시에 가장 기본적인 것도 포함하고 있다의 PHP 사전 정의 함수의 구현입니다.PHP 백(커널)은 언어 창조의 모든 것을 담았습니다.뚜렷한 특성을 가진 모듈.
콘텐츠 모듈로부터: 우리는 4계층 아키텍처로 나눌 수 있다.
1) Zend 엔진 : Zend 전체를 순수 c로 구현, php의 커널 부분은 php 코드 번역(어법, 구문 해석 등의 일련의 컴파일 과정)을 opcode의 처리를 가능하게 하고 그에 따른 처리 방법을 실현하며 기본적인 데이터 구조(hashtable, oo), 메모리 할당 및 관리, 그에 따른 API 방법을 외부 호출에 제공하는 모든 핵심이며, 모든 주변 기능은 zend를 중심으로 구현된다.
2) Extensions 확장: zend 참조를 중심으로옵티머스 익스텐션은 컴포넌트 방식으로 다양한 기반 서비스를 제공하고 있으며, 우리가 흔히 볼 수 있는 각종 내장함수(array 시리즈), 표준 라이브러리 등은 익스텐션을 통해 구현되며, 사용자도 필요에 따라 기능 확장, 성능 최적화 등의 목적을 달성할 수 있다(예를 들어 카페에서 사용 중인 php 중산층, 리치 텍스트 해석이 익스텐션의 대표적인 응용이다).
3) Sapi:Sapi 풀네임은 Server Application Programming Interface, 즉 서비스측 응용 프로그래밍 인터페이스입니다. sapi는 일련의 후크 함수를 통해 php와 주변 데이터를 상호 작용할 수 있습니다. 이것은 php가 매우 우아하고 성공적인 설계입니다. sapi를 통해 php 자체와 상위 계층을 디커플링 분리하는 데 성공했습니다. php는 서로 다른 응용에 대해 어떻게 호환을 할 것인가에 대해 더 이상 생각하지 않을 수 있습니다. 응용 자체도 자신의 특성에 맞게 구현하지 않을 수 있습니다.동일한 처리 방식.
4) 상위 앱: 이것이 우리가 평소에 쓰는 php 프로그램이다.웹서버를 통한 웹 애플리케이션 구현, 명령줄에서 스크립트 방식으로 실행되는 등 다양한 sapi 방식을 통해 다양한 응용 패턴을 얻을 수 있다.
그 아키텍처 아이디어: 엔진(Zend)+확장(ext) 모드: 내부 커플링 감소
중간층(sapi): 웹서버와 php의 통신 인터페이스로 웹서버와 php를 차단한다.
php가 차라면
차의 뼈대는 바로 php 그 자체, 즉 우리 밖에서 보는 완전한 시스템이다.
Zend는 차의 엔진(엔진)이다.
Ext 아래의 각종 조립품은 바로 차의 바퀴이다.
사피는 도로, 차는 다른 종류의 도로를 달릴 수 있다.
한 번의 php 실행은 자동차가 도로를 달리는 것이다.
따라서 성능이 뛰어난 엔진+적합한 바퀴+정확한 트랙이 필요하다.
2. php 라이프사이클
보기: 깊이php 하위계층: php 라이프사이클: http://blog.csdn.net/hguisu/article/details/7377520
3、사피
전술한 바와 같이sapi는 일련의 인터페이스를 통해 외부 응용 프로그램이 php와 데이터를 교환할 수 있도록 하며, 서로 다른 응용 프로그램의 특징에 따라 특정한 처리 방법을 구현할 수 있도록 한다.
1) ·apache2handler: 이것은 apache를 Webserver로서 mod_php 모드로 동작할 때의 처리 방식이며, 현재 가장 널리 사용되고 있다.
2)cgi,cgi:이거webserver와 php가 직접 상호작용하는 또 다른 방식, 즉 잘 알려진 fastcgi 프로토콜은 최근 올해 fastcgi+php가 점점 더 많이 응용되고 있다.r이 지원하는 유일한 방법。
3)cli, cli:줄 호출의 응용 프로그램 모드
그림과 같이: Sapi의 심플함그림:
Sapi의 정의 및 주요 인터페이스 함수:
struct _sapi_module_struct {
char *name; // 이름표지
char *pretty_name; // 더 잘 이해할 수 있는 이름
int (*startup)(struct _sapi_module_struct *sapi_module); // 시작함수
int (*shutdown)(struct _sapi_module_struct *sapi_module); // 닫기 방법
int (*activate)(TSRMLS_D); //활성화
int (*deactivate)(TSRMLS_D); // 중지하다
int (*ub_write)(const char *str, unsigned int str_length TSRMLS_DC);
// 캐시되지 않은 쓰기 작업(unbuffered write)
void (*flush)(void *server_context); // flush
struct stat *(*get_stat)(TSRMLS_D); // get uid
char *(*getenv)(char *name, size_t name_len TSRMLS_DC); // getenv
void (*sapi_error)(int type, const char *error_msg, ...); /* error
handler */
int (*header_handler)(sapi_header_struct *sapi_header, sapi_header_op_enum
op,
sapi_headers_struct *sapi_headers TSRMLS_DC); /* header handler */
/* send headers handler */
int (*send_headers)(sapi_headers_struct *sapi_headers TSRMLS_DC);
void (*send_header)(sapi_header_struct *sapi_header,
void *server_context TSRMLS_DC); /* send header handler */
int (*read_post)(char *buffer, uint count_bytes TSRMLS_DC); /* read POST
data */
char *(*read_cookies)(TSRMLS_D); /* read Cookies */
/* register server variables */
void (*register_server_variables)(zval *track_vars_array TSRMLS_DC);
void (*log_message)(char *message); /* Log message */
time_t (*get_request_time)(TSRMLS_D); /* Request Time */
void (*terminate_process)(TSRMLS_D); /* Child Terminate */
char *php_ini_path_override; //INI 경로 덮어쓰기
...
...
};
여기 이 중에서 주요 함수를 소개하겠습니다.
· startup:php가 변조됨CGI 모드와 같은 사용 시 초기화 작업은 startup 시 extension을 모두 로드하고 모듈 초기화 작업을 수행한다.
· shutdown:php관문폐시 마무리 작업
· activate: 초기 요청문화하다
· dectivate: 요청 매듭마무리 작업
· ub_write: 데이터 지정출력 방식, 예를 들어 apache2handler 방식은 php가 apache의 하나의 so로서 존재하기 때문에 그 출력은 바로 조정이다. apache의 ap_wr로ite함수, CGI모드에서는 계통write를 불러옵니다.
· sapi_error: 땡오처리 함수
· read_post: 읽기포스트 데이터
· register_server_variables: $_SERVER에 환경 변수를 등록하는 것은 일반적으로 서로 다른 프로토콜 기준에 따라 등록된 변수이다.
php 소스에서 sapi 구현많은 인터페이스:
4, php 스크립트 실행
SAPI가PHP 아키텍처의 상위 계층, 실제 스크립트 실행은 Zend 엔진이 수행한다.
현재 언어는 두 부류로 나뉜다.
클래스 1: 컴파일 언어c/c++java와 같은 공통점은 실행하기 전에 소스코드를 컴파일하고 컴파일해야 한다는 것입니다.이후의 타겟 파일.
제2종 언어: 해석형 언어PHP, 루비, 파이썬 같은 말이다.그들은 이러한 소스 코드를 실행하기 위해 인터프리터가 필요하다.실제로 이 언어들은 여전히 편집 과정을 거쳐야 한다..다만, 그들은 실행할 때 컴파일을 한다. 효율성을 위해 PHP의 다양한 opcode 캐시 확장과 같은 모든 것을 다시 컴파일하는 것은 아니다.CXcache 등).
설명:PHP 2000부터연간 발표되는 PHP4는 처음부터 해석적 언어가 아니었다.하나의 PHP 스크립트가 실행될 때, 먼저 PHP 원본Zend 엔진에 의해 컴파일된 코드Zend opcodes라는 이름의 기계 코드입니다.이 코드들은 RAM에 저장된다.그리고 opcodes 실행 진짜 스크립트를 실행한다.따라서 PHP는 실제로자바, C# 등의 언어는 컴파일 언어이다.그렇지 않으면 실행이 더디다.
PHP 스크립트가 어떻게 됐는지 한번 볼까요?실행됨. hello.php:
<?php
$str = "Hello world!\n";
echo $str;
명령줄 실행: php hello. php
출력 결과는 분명합니다: Hello World!
그런데 스크립트를 실행할 때 PHP/Zend가 무엇을 했습니까?어?
4.1, 프로그램의 실행:
1) php 프로그램 전달 필요원하는 실행 파일 hello.php, php 프로그램은 기본적인 준비를 마친 후 PHP 및 Zend 엔진을 작동시켜 등록된 확장 모듈을 로드합니다.
2) 초기화 후 읽기스크립트 파일, Zend엔진이 스크립트를 구문 분석, 구문 분석, 그리고 Zend엔진이 opcode 코드로 컴파일하고 마지막으로 o를 실행합니다.pcode 사이즈요.
php는 하나의 전형적인 동적 언어 실행 과정을 구현했다: 코드를 얻은 후, 구문 분석, 구문 분석 등의 단계를 거친 후, 소스 프로그램은 하나의 명령어(opcodes)로 번역되고, 그런 다음 ZEND 가상 머신은 순차적으로 이러한 명령어들을 수행하여 작업을 완료한다.PHP 자체는 c로 구현되기 때문에 최종적으로 호출되는 것도 모두 c의 함수이며, 실제로 우리는 php를 c가 개발한 소프트웨어로 볼 수 있다.
위에서 설명한 바와 같이 php의 실행의 핵심은 번역된 명령어 하나하나, 즉 opcode이다.
4.2, 어법분석과 문법분석
인터프리터는 일반적으로 두 부분으로 구성된다.
1), 소스 프로그램을 읽고 언어 구조를 처리합니다.
2)언어 구조에서 대상 프로그램 생성
렉스와 Yacc는 첫 번째 문제를 해결할 수 있다.많은 프로그래밍들이 Lex/Yacc를 언어의 단어 프랑스어법 분석 생성기로 가지고 있는데, 예를 들어 PHP, Python, Ruby는 이미 MySql의 sql 언어이다.
Lex 생성 구문 분석기.
Yacc 구문 분석 생성기
4. 3. opcode
PHP는 Zend VM 위에 구축되어 있으며, PHP의 opcode는 ZEND VM의 명령어, 즉 Opcode는 php 프로그램이 실행되는 가장 기본적인 단위이다.
'개발 꿀팁 > PHP' 카테고리의 다른 글
php 502 bad gateway 해결 방법 (0) | 2022.07.13 |
---|---|
PHP 오류 표시 설정 및 보고 수준 설정 (0) | 2022.07.13 |
PHP 쾌속 정거장 건설의 6가지 단계를 자세히 설명하다 (0) | 2022.07.12 |
PHP CLI 모드 설명 (0) | 2022.07.12 |
php 배열 요소의 빠른 무게 제거 (0) | 2022.07.12 |