PHP 的 SAPI 是個什麼東西

SAPI,特地去查了一下,它是 Server Application Programming Interface 的首字母縮寫,意思是服務器端應用編程接口。php

這是 PHP 內核提供給外部調用其服務的接口,即外部系統能夠經過 SAPI 來調用 PHP 提供的編譯腳本、執行腳本的服務。PHP 中實現的 SAPI 有不少,CliFpm 是咱們比較常見的。編程

從下圖能夠較爲清晰的理解外部系統是如何經過 SAPI 調用 PHP 服務的

image

圖片來源於網絡服務器

接下來主要是討論下咱們常見的 Cli、和 Fpm 是如何工做的。網絡

Cli

Cli(Command Line Interface),即命令行接口,用於在命令行下執行 PHP 腳本,就像 Shell 那樣,它是執行 PHP 腳本最簡便的一種方式。socket

Cli 是單進程模式,處理完請求後就直接關閉了,生命週期前後經歷 module startuprequest startupexecute scriptrequest shutdownmodule shutdown,其執行流程比較簡單,關鍵的處理過程以下:函數

main()-> php_cli_startup()-> do_cli()-> php_module_shutdown()
Fpm

Fpm(FastCGI Process Manager)是 PHP FastCGI 運行模式的一個進程管理器,從它的定義能夠看出,Fpm的核心功能是進程管理。spa

FastCGI 是 Web 服務器(如Nginx、Apache)和處理程序之間的一種通訊協議,它是與HTTP相似的一種應用層通訊協議。
注意:它只是一種協議!

Fpm 是一種多進程模型,它由一個 master 進程和多個 worker 進程組成。master 進程啓動時會建立一個 socket,可是不會接收、處理請求,而是由 fork 出的 worker 子進程完成請求的接收及處理。即 master 進程管理 worker 進程,而 worker 進程纔是真正的處理請求。命令行

Fpm 在啓動後首先會進行 SAPI 的註冊操做;接着會進入 PHP 生命週期的 module startup 階段,在這個階段會調用各個擴展定義的 MINT 鉤子函數。而後會進行一系列的初始化操做,最後 master、worker 進程進入不一樣的處理環節。code

worder 進程的生命週期以下圖:接口

image

圖片來源於網絡

其生命週期主要經歷這幾個階段:等待請求、解析請求、請求初始化、執行 PHP 腳本、關閉請求。

master 進程主要經過三種不一樣的方式來管理 worder 進程,分別是靜態模式(static)、動態模式(dynamic)、按需模式(ondemand)。具體要使用哪一種模式能夠在conf配置中經過pm指定。

相關文章
相關標籤/搜索