PHP生命週期

  在各個服務器抽象層質檢遵照着相同的約定,稱之爲SAPI接口,每一個SAPI接口實現都是一個_sapi_module_struct結構體變量。在PHP的源碼中,當須要調用服務器相關信息是時,都須要經過SAPI接口中對應的方法調用實現。 在PHP生命週期的各個階段,一些與服務相關的操做也會經過SAPI接口實現。這些內置實現的物理位置在PHP源碼的SAPI目錄。php

  SAPI(Server Application Programming Interface)指的是PHP具體應用的編程接口,就像PC同樣,不管安裝哪些操做系統,只要知足了PC的接口規範,均可以在PC上正常運行,PHP腳本執行有多種方式,經過web服務器(Apache、Nginx),或者直接在命令行下,也能夠嵌入到其餘的程序中。web

  腳本執行的開始都是以SPAI接口實現開始的。只是不一樣的SAPI接口實現會完成它們特定的工做,例如,Apache的mod_php SAPI實現須要初始化Apache獲取的一些信息,在輸出內容時將內容返回給Apache,其餘的SAPI實現也相似。編程

  一、開始和結束:api

  PHP開始執行後會通過兩個主要的階段:處理請求以前的開始階段和請求以後的結束階段。開始階段有兩個過程:過程一是模塊初始化階段(MINIT),在整個SAPI生命週期內(例如Apache啓動後的整個生命中週期內或者命令行程序整個執行過程當中),該過程僅執行一次;過程二是模塊激活階段(RINIT),該過程發生在請求階段,例如經過url請求某個頁面,則在每次請求以前都會進行模塊激活。服務器

  請求到達以後PHP初始化執行腳本的基本環境,例如建立一個執行環境等。而後PHP會調用全部模塊的RINIT函數,在這個階段各個模塊也會執行一些相關的操做。函數

  請求處理完成後就進入告終束階段,通常腳本執行到末尾或者經過調用exit()或die()函數,PHP都將進入結束階段。一樣包含兩個環節:在請求結束後停用模塊(RSHUTDOWN,對應RINIT) 和 在SAPI生命週期結束是關閉模塊(MSHUDOWN,對應MINIT)。編碼

  二、單進程SAPI生命週期:(模塊初始化、SAPI初始化、處理PHP請求、模塊關閉、SAPI關閉)url

  CLI/CGI模式的PHP屬於單進程的SAPI模式,這類的請求在處理一次請求後就關閉。操作系統

  ①啓動,在調用各個模塊的模塊初始化前,會有一個初始化的過程:命令行

    初始化若干全局變量(大多設置爲null),初始化若干常量(PHP本身的一些常量,要麼是硬編碼在程序中,好比PHP_VERSION,要麼寫在配置頭文件中),初始化Zend引擎和核心組件解析php.ini(php_ini_config函數的做用是讀取php.ini文件,設置配置參數,加載zend擴展並註冊PHP擴展函數),全局操做函數初始化,初始化靜態構建的模塊和共享模塊,禁用函數和類

  ②PHP調用php_request_startup作請求初始化操做,除了調用每一個模塊請求初始化函數外,還有一些其餘操做:激活zend引擎,激活SAPI,環境初始化,模塊請求初始化

  ③腳本運行:php_execute_script函數包含了腳本運行的所有過程。當一個PHP文件須要解析執行是,它可能須要執行前置執行文件、當前須要執行的文件、後置執行文件三個文件。對於須要解析執行的文件,經過zend_compile_file作詞法分析、語法分析和中間代碼生成操做,返回此文件的全部中間代碼。

  ④請求關閉:PHP關閉請求的過程是一個若干個關閉操做的集合,這個集合存在於php_request_shutdown函數中

  ⑤結束:flush(sapi_flush將最後的內容刷新出去),關閉Zend引擎(zend_shutdown)

  3、多進程SAPI生命週期

  一般PHP是編譯爲Apache的一個模塊來處理PHP請求的。Apache通常會採用多進程模式,Apache啓動後會fork出多個子進程,每一個進程的內存空間獨立、都會通過開始—結束環節,每一個進程開始階段只在fork出來之後進行,在整個進程的生命週期內可能會處理多個請求。以後在Apache關閉或者進程被結束以後纔會進行關閉階段,在這兩個階段之間會隨着每一個請求重複請求開始-請求關閉的環節。

相關文章
相關標籤/搜索