PHP 바 텀 메커니즘 및 관련 원 리 를 깊이 분석 하 다.

7555 단어 PHP하층
1,PHP 는 무엇 입 니까? 
PHP 는 우리 가 밖에서 본 완전한 시스템 을 말한다.헷 갈 리 게 들 리 지만 복잡 하지 않다.기능 적 으로 나 눌 수 있다.우 리 는 세 부분 으로 나 눌 수 있다.
1.해석 기 부분(Zend 는 엔진 으로)은 입력 코드 에 대한 분석,번역 과 집행 을 책임 집 니 다.
2.기능 성 부분(PHP 기능 함수 와 확장)은 언어의 각종 기능(예 를 들 어 함수 등)을 구체 적 으로 실현 하 는 것 을 책임 집 니 다.
3.인터페이스 부분(SAPI),WEB 서버 와 의 세 션 등 기능 을 담당 합 니 다.Zend 는 첫 번 째 부분의 전체 와 두 번 째 부분의 부분 을 포함 하고,PHP 내 핵 은 두 번 째 부분의 부분 과 세 번 째 부분의 전 부 를 포함한다.그들 은 합쳐서 PHP 가방 이 라 고 부른다.Zend 는 언어의 핵심 을 구성 하 는 동시에 가장 기본 적 인 PHP 미리 정 의 된 함수 의 실현 도 포함한다.PHP 패키지(커 널)는 언어 자체 의 다양한 특성 을 만 드 는 모든 모듈 을 포함한다. 
               
                                                                                                    (PHP 내부 구성 도)
 내용 모듈 에서 나 눌 수 있 습 니 다.우 리 는 4 층 체계 구조 로 나 눌 수 있 습 니 다.
1)Zend 엔진:Zend 는 전체적으로 순수 c 로 이 루어 집 니 다.phop 의 커 널 부분 입 니 다.phop 코드 번역(품사,문법 해석 등 일련의 컴 파일 과정)을 opcode 의 처 리 를 수행 하고 해당 하 는 처리 방법 을 실현 하 며 기본 적 인 데이터 구조(예 를 들 어 hashtable,oo),메모리 배분 과 관리,해당 하 는 api 방법 을 제공 하여 외부 호출 을 제공 하 는 것 이 모든 핵심 입 니 다.모든 외곽 기능 은 zend 를 중심 으로 이 루어 집 니 다.
2)Extensions 확장:zend 엔진 을 둘러싸 고 extensions 는 구성 요소 식 방식 으로 각종 기초 서 비 스 를 제공 합 니 다.우리 가 흔히 볼 수 있 는 각종 내장 함수(예 를 들 어 array 시리즈),표준 라 이브 러 리 등 은 모두 extension 을 통 해 이 루어 집 니 다.사용자 도 수요 에 따라 자신의 extension 을 실현 하여 기능 확장,성능 최적화 등 목적 을 달성 할 수 있 습 니 다(예 를 들 어 스티커 가 사용 하고 있 는 phop 중간 층,부 텍스트 해석 은 extension 의 전형 적 인 응용 이다.
3)Sapi:Sapi 는 모두 Server Application Programming Interface,즉 서버 응용 프로 그래 밍 인터페이스 라 고 부 릅 니 다.sapi 는 일련의 갈고리 함 수 를 통 해 phop 이 외곽 과 상호작용 할 수 있 도록 합 니 다.이것 은 phop 이 매우 우아 하고 성공 적 인 디자인 입 니 다.sapi 를 통 해 phop 본체 와 상부 응용 을 분리 하 는 데 성공 하 였 습 니 다.phop 는 서로 다른 응용 을 어떻게 호 환 하 는 지 고려 하지 않 을 수 있 습 니 다.응용 자체 도 자신의 특징 에 따라 서로 다른 처리 방식 을 실현 할 수 있다.
4)상부 응용 프로그램:이것 은 우리 가 평소에 작성 한 php 프로그램 입 니 다.서로 다른 sapi 방식 으로 다양한 응용 모델 을 얻 을 수 있 습 니 다.예 를 들 어 웹 서버 를 통 해 웹 응용 을 실현 하고 명령 행 에서 스 크 립 트 로 실행 하 는 등 입 니 다.
          
                                                                              (php 구조)
그 구조 사상:엔진(Zend)+확장(ext)모델:내부 결합 낮 추기
중간 층(sapi):웹 server 와 phop 의 통신 인터페이스,웹 server 와 phop 을 차단 합 니 다.
phop 이 차 라면...
차 의 프레임 워 크 는 phop 자체,즉 우리 밖에서 완전한 시스템 을 보 는 것 이다.
젠 드 는 차 의 엔진(엔진)이다.
Ext 아래 의 각종 구성 요 소 는 바로 차 의 바퀴 입 니 다.
사 피 는 도로 라 고 볼 수 있 고 차 는 서로 다른 유형의 도 로 를 달 릴 수 있다.
phop 프로그램의 실행 은 자동차 가 도 로 를 달 리 는 것 이다.
따라서 성능 이 우수한 엔진+적당 한 바퀴+정확 한 활주로 가 필요 합 니 다.
2.phop 수명 주기
      보기:php 밑바닥 깊이 이해:php 생명주기 :http://blog.csdn.net/hguisu/article/details/7377520
3 、sapi
앞에서 말 한 바 와 같이 sapi 는 일련의 인 터 페 이 스 를 통 해 외부 응용 이 pp 와 데 이 터 를 교환 할 수 있 고 서로 다른 응용 특징 에 따라 특정한 처리 방법 을 실현 할 수 있 습 니 다.우리 가 흔히 볼 수 있 는 sapi 는 다음 과 같 습 니 다.
1)、apache2handler:apache 를 웹 서버 로 하고 mod 를 사용 합 니 다.php 모드 가 실 행 될 때의 처리 방식 도 현재 가장 광범 위 하 게 응용 되 고 있 는 것 이다.
2),cgi:이것 은 웹 서버 와 php 의 직접적인 또 다른 상호작용 방식 입 니 다.즉,유명한 fastcgi 프로 토 콜 입 니 다.최근 에 fastcgi+php 는 점점 더 많은 응용 을 얻 었 고 비동기 웹 서버 가 유일 하 게 지원 하 는 방식 입 니 다.
3),cli:명령 행 호출 응용 모드
그림:Sapi 의 간단 한 설명도

 Sapi 의 정의 및 주요 인터페이스 함수:
struct _sapi_module_struct { char *name; // 이름 표식 char*prettyname; // 더 잘 이해 되 는 이름 int(*startup)(structsapi_module_struct *sapi_module); // 시작 함수 int(*shutdown)(structsapi_module_struct *sapi_module); // 닫 는 방법 int(*activate)(TSRMLSD); //int(*비활성화)활성화(TSRMLSD); // 사용 정지 int(*ubwrite)(const char *str, unsigned int str_length TSRMLS_DC); // 캐 시 없 는 쓰기 동작(unbuffered write)void(*flush)(void*servercontext); // 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:아파 치 2handler 와 같은 데이터 출력 방식 을 지정 합 니 다.php 는 아파 치 의 so 로 존재 하기 때문에 출력 은 바로 조정 입 니 다. apache 의 ap 로write 함수,cgi 모드 에 서 는 시스템 에서 write 를 호출 합 니 다.
・  sapi_error:오류 처리 함수
・  read_post:post 데이터 읽 기
・  register_server_variables:$SERVER 에 등 록 된 환경 변 수 는 일반적으로 프로 토 콜 표준 에 따라 등 록 된 변수 입 니 다.
php 소스 코드 에서 sapi 는 많은 인 터 페 이 스 를 실현 했다.다음 그림:

4.phop 스 크 립 트 의 실행
SAPI 는 PHP 구조의 상층 부 에 있 고 진정한 스 크 립 트 실행 은 Zend 엔진 으로 이 루어 집 니 다.
현재 언어 는 두 가지 로 나 뉜 다.
첫 번 째 유형:컴 파일 형 언어.예 를 들 어 c/c+자바 와 같은 공통점 은 실행 하기 전에 소스 코드 를 컴 파일 한 다음 에 컴 파일 된 대상 파일 을 실행 해 야 한 다 는 것 입 니 다.
두 번 째 언어:해석 형 언어:예 를 들 어 PHP,Ruby,Python.그들 은 이 소스 코드 들 을 실행 하기 위해 서 해석 기 를 필요 로 한다.사실 이 언어 들 은 번역 절 차 를 거 쳐 야 한다.다만 그들 이 실행 할 때 컴 파일 을 하 는 것 은 효율 을 위해 실행 할 때마다 다시 컴 파일 하 는 것 이 아니다.예 를 들 어 PHP 의 각종 opcode 캐 시 확장(예 를 들 어 APC Xcache 등)이다.
설명:PHP 는 2000 년 발 표 된 PHP 4 부터 해석 언어 가 아니 었 다.PHP 스 크 립 트 가 실 행 될 때 먼저 PHP 소스 코드 는 Zend 엔진 에서 Zend opcodes 라 는 기계 코드 로 컴 파일 됩 니 다.이 코드 들 은 RAM 에 저장 되 어 있다.그리고 opcodes 를 실행 하여 실제 스 크 립 트 를 실행 합 니 다.따라서 PHP 는 사실상 자바,C\#등 언어 와 마찬가지 로 컴 파일 언어 다.그렇지 않 으 면,그것 의 집행 은 매우 느 릴 것 이다.
PHP 스 크 립 트 가 어떻게 실행 되 는 지 봅 시다.hello.php:
명령 행 실행:php hello.php
출력 결 과 는 분명히:Hello world!
그런데 스 크 립 트 를 실행 할 때 PHP/Zend 는 무엇 을 했 습 니까?
4.1.프로그램의 실행:
1)phop 프로그램 에 필요 한 실행 파일 hello.phop,phop 프로그램 이 기본 적 인 준비 작업 을 마 친 후 PHP 및 Zend 엔진 을 시작 하여 등 록 된 확장 모듈 을 불 러 옵 니 다.
2)초기 화 후 스 크 립 트 파일 을 읽 습 니 다.Zend 엔진 은 스 크 립 트 에 대해 이 품사 분석,문법 분석 을 한 다음 에 Zend 엔진 이 opcode 코드 로 컴 파일 되 어 마지막 으로 opcode 코드 를 실행 합 니 다.
php 코드 의 실행 과정 은 다음 과 같 습 니 다.
                           
php 는 전형 적 인 동적 언어 실행 과정 을 실현 했다.코드 를 받 은 후에 품사 해석,문법 해석 등 단 계 를 거 친 후에 소스 프로그램 은 하나의 명령(opcodes)으로 번역 되 고 ZEND 가상 기 는 이 명령 을 순서대로 실행 하여 작업 을 완성 한다.PHP 자체 가 c 로 이 루어 졌 기 때문에 최종 적 으로 호출 된 것 도 모두 c 의 함수 입 니 다.실제로 우 리 는 phop 을 c 가 개발 한 소프트웨어 로 볼 수 있 습 니 다.
위의 설명 을 통 해 알 수 있 듯 이 phop 의 실행 핵심 은 번역 한 명령,즉 opcode 이다.
4.2 어법 분석 과 문법 분석
해석 기 는 일반적으로 두 부분 을 포함한다.
1)소스 프로그램 을 읽 고 언어 구 조 를 처리 합 니 다.
2)언어 구조 에 있 고 대상 프로그램 생 성
Lex 와 Yacc 는 첫 번 째 문 제 를 해결 할 수 있 습 니 다.많은 프로 그래 밍 은 Lex/Yacc 를 언어 로 하 는 문법 분석 생 성기 가 있 습 니 다.예 를 들 어 PHP,Python,Ruby 는 이미 MySql 의 sql 언어 입 니 다.
Lex 생 성 어법 분석 기.
Yacc 문법 분석 생 성기
4. 3、opcode
PHP 가 Zend 가상 머 신(Zend VM)위 에 구 축 된 경우,PHP 의 opcode 는 ZEND 가상 머 신의 명령,즉 Opcode 는 php 프로그램 이 실행 하 는 가장 기본 적 인 단위 이다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기