來源:不言 發(fā)布時間:2018-09-18 15:25:26 閱讀量:850
本篇文章給大家?guī)淼膬?nèi)容是關(guān)于PHP中的SAPI是什么?如何實現(xiàn)?(圖文),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。
SAPI,特意去查了一下,它是 Server Application Programming Interface 的首字母縮寫,意思是服務(wù)器端應(yīng)用編程接口。
這是 PHP 內(nèi)核提供給外部調(diào)用其服務(wù)的接口,即外部系統(tǒng)可以通過 SAPI 來調(diào)用 PHP 提供的編譯腳本、執(zhí)行腳本的服務(wù)。PHP 中實現(xiàn)的 SAPI 有很多,Cli、Fpm 是我們比較常見的。
圖片來源于網(wǎng)絡(luò)
接下來主要是討論下我們常見的 Cli、和 Fpm 是如何工作的。
Cli(Command Line Interface),即命令行接口,用于在命令行下執(zhí)行 PHP 腳本,就像 Shell 那樣,它是執(zhí)行 PHP 腳本最簡便的一種方式。
Cli 是單進(jìn)程模式,處理完請求后就直接關(guān)閉了,生命周期先后經(jīng)歷 module startup、request startup、execute script、request shutdown、module shutdown,其執(zhí)行流程比較簡單,關(guān)鍵的處理過程如下:
1 | main()-> php_cli_startup()-> do_cli()-> php_module_shutdown() |
Fpm(FastCGI Process Manager)是 PHP FastCGI 運行模式的一個進(jìn)程管理器,從它的定義可以看出,F(xiàn)pm的核心功能是進(jìn)程管理。
FastCGI 是 Web 服務(wù)器(如Nginx、Apache)和處理程序之間的一種通信協(xié)議,它是與HTTP類似的一種應(yīng)用層通信協(xié)議。
注意:它只是一種協(xié)議!
Fpm 是一種多進(jìn)程模型,它由一個 master 進(jìn)程和多個 worker 進(jìn)程組成。master 進(jìn)程啟動時會創(chuàng)建一個 socket,但是不會接收、處理請求,而是由 fork 出的 worker 子進(jìn)程完成請求的接收及處理。即 master 進(jìn)程管理 worker 進(jìn)程,而 worker 進(jìn)程才是真正的處理請求。
Fpm 在啟動后首先會進(jìn)行 SAPI 的注冊操作;接著會進(jìn)入 PHP 生命周期的 module startup
階段,在這個階段會調(diào)用各個擴(kuò)展定義的 MINT 鉤子函數(shù)。然后會進(jìn)行一系列的初始化操作,最后 master、worker 進(jìn)程進(jìn)入不同的處理環(huán)節(jié)。
worder 進(jìn)程的生命周期如下圖:
圖片來源于網(wǎng)絡(luò)
其生命周期主要經(jīng)歷這幾個階段:等待請求、解析請求、請求初始化、執(zhí)行 PHP 腳本、關(guān)閉請求。
master 進(jìn)程主要通過三種不同的方式來管理 worder 進(jìn)程,分別是靜態(tài)模式(static)、動態(tài)模式(dynamic)、按需模式(ondemand)。具體要使用哪種模式可以在conf配置中通過pm指定