>  기사  >  백엔드 개발  >  PHP 하단에 PHP 수명주기에 대한 자세한 설명이 나와 있습니다.

PHP 하단에 PHP 수명주기에 대한 자세한 설명이 나와 있습니다.

小云云
小云云원래의
2018-03-22 15:36:071815검색

이 글은 주로 PHP 하단에 있는 PHP 라이프사이클에 대한 자세한 설명을 공유하고 있습니다. 도움이 되길 바랍니다.

1. PHP 작동 모드:

PHP의 두 가지 작동 모드는 WEB 모드와 CLI 모드입니다. 어떤 모드에 관계없이 PHP는 동일하게 작동하며 SAPI로 실행됩니다.

1. 터미널에 php 명령을 입력하면 CLI를 사용합니다.

요청이 완료되면 제어권이 터미널로 반환되도록 PHP를 지원하는 웹 서버와 같습니다.

2. Apache 또는 다른 웹 서버를 호스트로 사용하는 경우 요청이 오면 PHP는 요청 완료를 지원합니다. 일반적으로 다음이 있습니다:

다중 프로세스(보통 PHP 요청을 처리하기 위해 Apache 모듈로 컴파일됨)

다중 스레드 모드

2. 모든 것의 시작: SAPI 인터페이스

일반적으로 우리는 Apache 또는 Nginx와 같은 웹 서버를 통해 PHP 웹 프로그램 테스트 스크립트를 작성하거나 명령줄에서 PHP 프로그램을 통해 PHP 스크립트를 실행하면 서버가 응답하고 브라우저에 응답 정보가 표시되거나 명령이 완료됩니다. , 표준 출력 표시 내용. 우리는 PHP 인터프리터가 어디에 있는지 거의 신경 쓰지 않습니다. 웹 서버와 명령줄 프로그램을 통해 스크립트를 실행하는 것은 매우 다르지만 실제로는 명령줄 프로그램이 웹 프로그램과 유사하며 명령줄 매개변수가 전달됩니다. 실행 스크립트는 URL을 통해 PHP 페이지를 요청하는 것과 같습니다. 스크립트가 완료된 후 응답 결과가 반환되지만 터미널에 명령줄 응답 결과가 표시됩니다. 스크립트 실행의 시작은 SAPI를 통해 수행됩니다.

1) 아파치 시작: /usr/local/apache/bin/apachectl start에 대한 응답과 같이 특정 SAPI가 시작되면 PHP는 커널 하위 시스템을 초기화하여 시작됩니다. 시작 루틴이 끝나갈 무렵 각 확장의 코드를 로드하고 해당 모듈 초기화 루틴(MINIT)을 호출합니다. 이를 통해 각 확장은 내부 변수를 초기화하고, 리소스를 할당하고, 리소스 핸들러를 등록하고, 자체 함수를 ZE에 등록하여 ZE가 스크립트가 함수를 호출할 때 실행할 코드를 알 수 있도록 합니다.

2) 요청 처리 초기화 : 다음으로 PHP는 SAPI 레이어가 처리할 페이지를 요청할 때까지 기다립니다. CGI 또는 CLI와 같은 SAPI의 경우 이는 즉시 한 번만 발생합니다. Apache, IIS 또는 기타 성숙한 웹 서버 SAPI의 경우 이는 원격 사용자가 페이지를 요청할 때마다 발생하므로 동시에 여러 번 반복됩니다. 요청이 어떻게 생성되는지에 관계없이 PHP는 ZE에게 스크립트의 실행 환경 설정을 요청한 후 각 확장의 요청 초기화를 호출합니다. (RINIT) 기능. RINIT는 확장 기능을 통해 특정 환경 변수를 설정하거나, 요청 시 리소스를 할당하거나, 감사와 같은 다른 작업을 수행할 수 있는 기회를 제공합니다. 세션 확장에서 RINIT의 역할에 대한 일반적인 예가 있습니다. session.auto_start 옵션이 활성화되면 RINIT는 사용자 공간과 사전 조립된 $_SESSION 변수에서 session_start() 함수를 자동으로 트리거합니다.

3) PHP 코드 실행: 요청이 초기화되면 ZE가 제어권을 인수하기 시작하고 PHP 스크립트를 기호로 변환한 다음 마지막으로 opcode를 구성하고 단계별로 실행합니다. opcode가 확장 함수를 호출해야 하는 경우 ZE는 매개변수를 함수에 바인딩하고 함수가 완료될 때까지 일시적으로 제어를 포기합니다.

4) 스크립트 끝: 스크립트가 실행된 후 PHP는 각 확장의 요청 종료(RSHUTDOWN) 함수를 호출하여 최종 정리 작업(예: 세션 변수를 디스크에 저장)을 수행합니다. 다음으로 ZE는 정리 프로세스(가비지 수집)를 수행합니다. 즉, 이전 요청 중에 사용된 모든 변수를 효과적으로 설정 해제()합니다.

5), sapi close: 완료되면 PHP는 SAPI의 다른 문서 요청이나 종료 신호를 계속 기다립니다. CGI 및 CLI와 같은 SAPI의 경우 "다음 요청"이 없으므로 SAPI가 즉시 종료되기 시작합니다. 종료 중에 PHP는 다시 각 확장을 반복하고 모듈 종료(MSHUTDOWN) 함수를 호출한 다음 결국 자체 커널 하위 시스템을 종료합니다.

간단한 과정은 다음과 같습니다.

1. Apache 시작과 함께 PHP가 실행됩니다.
2. PHP는 mod_php5.so 모듈을 통해 Apache와 연결됩니다(구체적으로는 SAPI, 즉 서버 응용 프로그램 프로그래밍).
3. PHP에는 총 3개의 모듈이 있습니다: 커널, Zend 엔진, 확장 레이어
4. PHP 커널은 요청, 파일 스트림, 오류 처리 및 기타 관련 작업을 처리하는 데 사용됩니다. )는 소스 파일을 기계어로 변환한 다음 가상 머신에서 실행하는 데 사용됩니다.
6. 확장 계층은 PHP가 특정 작업을 수행하는 데 사용하는 함수, 클래스 라이브러리 및 스트림의 집합입니다. 예를 들어 MySQL 데이터베이스에 연결하려면 mysql 확장이 필요합니다.
7. ZE가 프로그램을 실행할 때 여러 확장에 연결해야 할 수도 있습니다. 이때 ZE는 제어권을 확장에 넘겨주고 처리 후 반환합니다.
8. 마지막으로 ZE는 프로그램 실행 결과를 PHP 커널로 반환하고, 그 결과를 SAPI 레이어로 전송하고 최종적으로 브라우저로 출력합니다.

3. PHP의 시작과 끝 단계

시작 단계에는 두 가지 프로세스가 있습니다:

첫 번째 프로세스: 요청이 도착하기 전에 발생하는 Apache 시작 프로세스. 전체 SAPI 수명주기(예: Apache 시작 후 전체 수명주기 또는 명령줄 프로그램의 전체 실행 프로세스)의 시작 단계(MINIT)입니다. 이 단계는 한 번만 수행됩니다.. Apache를 시작한 후 PHP 인터프리터도 시작됩니다. PHP는 각 확장(모듈)의 MINIT 메서드를 호출하여 이러한 확장을 사용 가능한 상태로 전환합니다. php.ini 파일에 어떤 확장 기능이 열려 있는지 살펴보세요. MINIT는 "모듈 초기화"를 의미합니다. 각 모듈은 다른 요청을 처리하기 위해 일련의 함수, 클래스 라이브러리 등을 정의합니다. 모듈은 이 단계에서 상수 등록, 모듈에서 사용하는 클래스 정의 등과 같은 일부 초기화 작업을 수행할 수 있습니다. 일반적인 모듈 콜백 ​​함수 MINIT 메서드는 다음과 같습니다.

PHP_MINIT_FUNCTION(myphpextension) { /* Initialize functions, classes etc */ }
{
    // 注册常量或者类等初始化操作
    return SUCCESS; 
}

두 번째 프로세스는 요청 단계에서 발생합니다, 페이지 요청이 발생하면. 각 요청(RINIT 요청 시작) 전에 초기화 프로세스가 수행됩니다.

요청이 도착한 후 SAPI 계층이 제어권을 갖습니다. PHP 레이어에 PHP 초기화이 요청스크립트를 실행하는 데 필요한환경 변수, 예를 들어 PHP 실행 중 변수 이름과 변수 값 내용을 저장하는 심볼 테이블을 포함한 실행 환경을 생성합니다. 현재 모든 함수와 클래스의 심볼 테이블은 물론 세션 모듈의 RINIT입니다. php.ini에서 세션 모듈이 활성화되면 모듈의 RINIT가 활성화될 때 $_SESSION 변수가 초기화됩니다. 그러면 PHP는 모든 모듈의 RINIT 함수, 즉 "초기화 요청"을 호출합니다. 이 단계에서 각 모듈은 일부 관련 작업을 수행할 수도 있습니다. 모듈의 RINIT 기능은 MINIT 기능과 유사합니다. RINIT 방법은 프로그램 실행 사이에 자동으로 시작되는 준비 프로세스로 간주될 수 있습니다.

PHP_RINIT_FUNCTION(myphpextension)
{
    // 例如记录请求开始时间
    // 随后在请求结束的时候记录结束时间.这样我们就能够记录下处理请求所花费的时间了
    return SUCCESS; 
}

종료 단계는 두 단계로 나누어집니다:

요청이 처리된 후 종료 단계에 들어갑니다. 일반적으로 스크립트는 끝까지 실행되거나 종료()를 호출하여 실행됩니다. 또는 die() 함수, PHP 둘 다 시작 단계에 따라 종료 단계도 두 단계로 나누어집니다. 하나는 요청이 끝난 후(RSHUWDOWN)이고 다른 하나는 SAPI 수명이 끝날 때입니다.

첫 번째 각 링크: 요청 처리 후 종료 단계: 요청이 처리된 후 종료 단계에 진입하며, PHP는 정리를 시작합니다. 프로세스. 각 모듈의 RSHUTDOWN 메서드를 순서대로 호출합니다. RSHUTDOWN은 프로그램 실행 시 생성된 기호 테이블을 지우는 데, 즉 각 변수에 대해 설정되지 않은 함수를 호출하는 데 사용됩니다. 일반적인 RSHUTDOWN 방법은 다음과 같습니다.

PHP_RSHUTDOWN_FUNCTION(myphpextension)
{
    // 例如记录请求结束时间, 并把相应的信息写入到日至文件中.
    return SUCCESS; 
}

두 번째 링크:

마지막으로 모든 요청이 처리되었으며 SAPI가 닫힐 준비가 되었습니다. PHP는 각 확장의 MSHUTDOWN 방법을 호출합니다. 각 모듈은 메모리를 확보할 수 있는 기회입니다. (이것은CGI, CLI 등 SAPI의 경우 "다음 요청"이 없으므로 SAPI는 즉시 종료를 시작합니다.)일반적인 RSHUTDOWN 방법은 다음과 같습니다.

PHP_MSHUTDOWN_FUNCTION(extension_name) { 
    /* Free handlers and persistent memory etc */ 
    return SUCCESS; 
}

이렇게 하면 PHP 전체의 수명 주기가 종료됩니다. "첫 번째 단계 시작"과 "두 번째 단계 닫기"는 서버의 요청이 없을 때만 실행된다는 점에 유의하세요.

SAPI는 다음 단계를 통해 PHP를 실행합니다.
1. 모듈 초기화 단계(Module init) :
즉, 각 확장 소스 코드에서 PHP_MINIT_FUNCTION의 메소드를 호출하여 모듈을 초기화하고 모듈에 필요한 일부 변수를 수정합니다. 애플리케이션, 메모리 할당 등初 2.
요청 이니셜 :
클라이언트의 요청을 받은 후 각 확장된 PHP_RINIT_FUNCTION 메서드를 호출하여 PHP 스크립트의 실행 환경을 초기화합니다.
3. PHP 스크립트 실행
4. Request Shutdown(Request Shutdown) :
3. 이때 각 Extension의 PHP_RSHUTDOWN_FUNCTION 메서드를 호출하여 요청 사이트를 정리하고 ZE가 시작됩니다. 변수와 메모리를 재활용합니다.模 5.
모듈 SHUTDOWN : 웹 서버가 종료되거나 명령줄 스크립트가 실행됩니다. 단일 프로세스 SAPI 모드에 속합니다. 이 유형의 요청은 요청을 한 번 처리한 후 종료됩니다. 즉, 다음 링크만 통과하게 됩니다. 시작 - 요청 시작 - 요청 종료 - 종료 SAPI 인터페이스 구현은 수명 주기를 완료합니다. 그림에 표시된 대로:

、 5, 다중 프로세스 SAPI 수명 주기

일반적으로 PHP는 일반적으로 PHP 요청을 처리하기 위해 Apache로 컴파일된 모듈입니다. Apache는 일반적으로 다중 프로세스 모드를 채택합니다. Apache가 시작된 후

여러 하위 프로세스가 분기됩니다. 각 프로세스는 독립적인 메모리 공간을 갖습니다. 그러나 각 프로세스의 시작 단계는 다음과 같습니다. 프로세스가 나온 후에 분기되며 프로세스의 수명 주기 동안 여러 요청이 처리될 수 있습니다. Apache가 종료되거나 처리되는 경우에만

被结束之后才会进行关闭阶段,在这两个阶段之间会随着每个请求重复请求开始-请求关闭的环节。 

如图所示:

                                     


6、多线程的SAPI生命周期

多线程模式和多进程中的某个进程类似,不同的是在整个进程的生命周期内会并行的重复着 请求开始-请求关闭的环节.

在这种模式下,只有一个服务器进程在运行着,但会同时运行很多线程,这样可以减少一些资源开销,向Module init和Module shutdown就只需要运行一遍就行了,一些全局变量也只需要初始化一次,因为线程独具的特质,使得各个请求之间方便的共享一些数据成为可能。

 多线程工作方式如下图

                              

7、Apache一般使用多进程模式prefork

        在linux下使用#http –l 命令可以查看当前使用的工作模式。也可以使用#apachectl -l命令。
        看到的prefork.c,说明使用的prefork工作模式。

        prefork 进程池模型,用在 UNIX 和类似的系统上比较多,主要是由于写起来方便,也容易移植,还不容易出问题。要知道,如果采用线程模型的话,用户线程、内核线程和混合型线程有不同的特性,移植起来就麻烦。prefork 模型,即预先 fork() 出来一些子进程缓冲一下,用一个锁来控制同步,连接到来了就放行一个子进程,让它去处理。

    prefork MPM 使用多个子进程,每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接。在大多数平台上,Prefork MPM在效率上要比Worker MPM要高,但是内存使用大得多。prefork的无线程设计在某些情况下将比worker更有优势:他能够使用那些没有处理好线程安全的第三方模块,并 且对于那些线程调试困难的平台而言,他也更容易调试一些。

위 내용은 PHP 하단에 PHP 수명주기에 대한 자세한 설명이 나와 있습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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