在PHP生命週期的各個階段,一些與服務相關的操作都是通過SAPI介面實現。
各個伺服器抽象層之間遵守著相同的約定,這裡我們稱之為SAPI介面。
在PHP的原始碼中,當需要呼叫伺服器相關資訊時,全部通過SAPI介面中對應的方法呼叫實現
php-fpm + nginx
php + terminal
...
SAPI(Server Application Programming Interface)
伺服器應用程式程式設計介面,即PHP與其他應用互動的介面.
每個SAPI
實現都是一個_sapi_module_struct
結構體變數。
PHP指令碼要執行有很多方式,通過Web伺服器,或者直接在命令列下,也可以嵌入在其他程式中。
SAPI
提供了一個和外部通訊的介面,常見的SAPI
有:cgi
、fast-cgi
、cli
、isapi
apache模組的DLL
ISAPI
模式 (eg Apache : apache2handler mode ) 以web伺服器的一個模組載入執行,其實就是將PHP的原始碼與webServer的程式碼一起編譯,執行時是同一個程序,共用同一個地址空間. 例如 LAMP中,PHP就是作為Apache的一個模組執行的.Apache是多執行緒呼叫php模組的.(same as IIS)CGI
模式 fork-and-execute
webServer將動態請求轉發到CGI程式(以php為例子),就相當於fork一個子程序,然後exec(php process)
,用CGI程式來解釋請求內容,最後將子程序的output
返回.此時webServer與php程序的地址空間是獨立的.此時的php是作為一個獨立的程式執行.FastCGI
模式 這種形式是CGI的加強版本,CGI是單程序,多執行緒的執行方式,程式執行完成之後就會銷燬,所以每次都需要載入設定和環境變數(建立-執行)。CLI
command line interfacephp_module_startup
php_request_startup
php_execute_script
php_request_shutdown
php_module_shutdown
php 5.3.3
以後的php-fpm
不再支援php-fpm (start|stop|reload)
等命令,需要使用訊號控制.php-fpm master
程序可以理解以下訊號
kill -USR1 "php-fpm master pid"
重新開啟紀錄檔檔案. 執行完畢後 你會發現php-fpm master/worker
程序id
not changekill -USR2 "php-fpm master pid"
平滑過載所有php-fpm
程序,執行完畢後你會發現php-fpm master/worker
程序id
have changed.kill -KILL/-9 php-fpm-master.pid
, 強制殺死master程序,該訊號不允許中斷/阻塞,此時master程序無法通知回收worker程序,所以此時worker
程序仍然監聽port,仍然可以正常處理http請求.kill -INT/-QUIT/-TERM master pid
, stop php-fpm service
訊號被當前程序樹接收到.也就是說,不僅當前程序會收到訊號,它的子程序也會收到.kill master pid
傳送SIGTERM
訊號到程序 訊號可能會被阻塞,master
可以回收worker
程序.example.
[sujianhui@dev529 ~]$>ps aux | grep php-fpm
root 17000 0.0 0.0 243220 7208 ? Ss 17:00 0:00 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
sujianh+ 17001 0.0 0.0 245304 7072 ? S 17:00 0:00 php-fpm: pool www
sujianh+ 17002 0.0 0.0 245304 7072 ? S 17:00 0:00 php-fpm: pool www
sujianh+ 17069 0.0 0.0 112816 976 pts/3 S+ 17:01 0:00 grep --color=auto php-fpm
[sujianhui@dev529 ~]$>sudo kill -USR1 17000
[sujianhui@dev529 ~]$>ps aux | grep php-fpm
root 17000 0.0 0.0 243220 7208 ? Ss 17:00 0:00 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
sujianh+ 17001 0.0 0.0 245304 7072 ? S 17:00 0:00 php-fpm: pool www
sujianh+ 17002 0.0 0.0 245304 7072 ? S 17:00 0:00 php-fpm: pool www
sujianh+ 17105 0.0 0.0 112816 972 pts/3 S+ 17:01 0:00 grep --color=auto php-fpm
[sujianhui@dev529 ~]$>sudo kill -USR2 17000
[sujianhui@dev529 ~]$>ps aux | grep php-fpm
root 17122 0.0 0.0 243220 7212 ? Ss 17:01 0:00 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)
sujianh+ 17123 0.0 0.0 245304 7072 ? S 17:01 0:00 php-fpm: pool www
sujianh+ 17124 0.0 0.0 245304 7072 ? S 17:01 0:00 php-fpm: pool www
sujianh+ 17126 0.0 0.0 112816 976 pts/3 S+ 17:01 0:00 grep --color=auto php-fpm
[sujianhui@dev529 ~]$>pstree 17122 -a
php-fpm
├─php-fpm
└─php-fpm
[sujianhui@dev529 ~]$>sudo kill -INT 17122
[sujianhui@dev529 ~]$>ps aux | grep php-fpm
sujianh+ 17229 0.0 0.0 112816 976 pts/3 S+ 17:03 0:00 grep --color=auto php-fpm
so we should use sudo kill -INT master.pid
to kill php-fpm service.
nginx的master-worker機制與fpm大體相同.但是有一個問題需要注意,使用systemctl啟動起來的master被kill以後,worker也會死掉.
正常啟動nginx,kill掉master
[sujianhui@dev0529 sbin]$>which nginx
/usr/sbin/nginx
[sujianhui@dev0529 sbin]$>sudo nginx
[sujianhui@dev0529 sbin]$>ps aux | grep nginx
root 4562 0.0 0.0 46608 1084 ? Ss 21:46 0:00 nginx: master process nginx
sujianh+ 4563 0.0 0.0 49128 2088 ? S 21:46 0:00 nginx: worker process
sujianh+ 4578 0.0 0.0 112812 972 pts/0 S+ 21:46 0:00 grep --color=auto nginx
[sujianhui@dev0529 sbin]$>sudo kill -9 4562
[sujianhui@dev0529 sbin]$>ps aux | grep nginx
sujianh+ 4563 0.0 0.0 49128 2088 ? S 21:46 0:00 nginx: worker process
sujianh+ 4612 0.0 0.0 112812 972 pts/0 S+ 21:46 0:00 grep --color=auto nginx
[sujianhui@dev0529 sbin]$>kill -9 4563
[sujianhui@dev0529 sbin]$>ps aux | grep nginx
sujianh+ 4638 0.0 0.0 112812 972 pts/0 S+ 21:47 0:00 grep --color=auto nginx
使用systemctl啟動的master被kill掉以後,worker也會殺掉
[sujianhui@dev0529 sbin]$>systemctl start nginx
[sujianhui@dev0529 sbin]$>ps aux | grep nginx
root 4678 0.0 0.0 46608 1072 ? Ss 21:47 0:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
sujianh+ 4679 0.0 0.0 49124 2080 ? S 21:47 0:00 nginx: worker process
sujianh+ 4702 0.0 0.0 112812 972 pts/0 S+ 21:47 0:00 grep --color=auto nginx
[sujianhui@dev0529 sbin]$>sudo kill -9 4678
[sujianhui@dev0529 sbin]$>ps aux | grep nginx
sujianh+ 4732 0.0 0.0 112812 972 pts/0 S+ 21:47 0:00 grep --color=auto nginx
rective run
[sujianhui@dev529 ~]$>kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
[sujianhui@dev529 ~]$>sudo nginx
[sudo] password for sujianhui:
[sujianhui@dev529 ~]$>ps aux | grep nginx
root 3628 0.0 0.0 46600 1052 ? Ss 09:49 0:00 nginx: master process nginx
sujianh+ 3629 0.0 0.0 49096 2056 ? S 09:49 0:00 nginx: worker process
sujianh+ 3637 0.0 0.0 112812 972 pts/0 S+ 09:49 0:00 grep --color=auto nginx
[sujianhui@dev529 ~]$>sudo kill -SIGTERM 3628
[sujianhui@dev529 ~]$>ps aux | grep nginx
sujianh+ 3744 0.0 0.0 112812 972 pts/0 S+ 09:50 0:00 grep --color=auto nginx
[sujianhui@dev529 ~]$>sudo nginx
[sujianhui@dev529 ~]$>ps aux | grep nginx
root 3766 0.0 0.0 46600 1052 ? Ss 09:51 0:00 nginx: master process nginx
sujianh+ 3767 0.0 0.0 49096 2056 ? S 09:51 0:00 nginx: worker process
sujianh+ 3775 0.0 0.0 112812 972 pts/0 S+ 09:51 0:00 grep --color=auto nginx
[sujianhui@dev529 ~]$>sudo kill -9 3766
[sujianhui@dev529 ~]$>ps aux | grep nginx
sujianh+ 3767 0.0 0.0 49096 2056 ? S 09:51 0:00 nginx: worker process
sujianh+ 3799 0.0 0.0 112812 972 pts/0 S+ 09:51 0:00 grep --color=auto nginx