fpm处事的要领详解

各个处事器抽象层之间遵守着沟通的约定,这里我们称之为SAPI接口。

在PHP的源码中,当需要挪用处事器相关信息时,全部通过SAPI接口中对应的要领挪用实现

php-fpm + nginx php + terminal ...

PHP常见的四种运行模式

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是单历程,多线程的运行方法,措施执行完成之后就会销毁,所以每次都需要加载设置和情况变量(建设-执行)。
而FastCGI则差异,FastCGI 是一个常驻 (long-live) 型的 CGI,它可以一直执行着,只要激活后,不会每次都要耗费时间去 fork 一次。

CLI command line interface

CLI

php_module_startup php_request_startup php_execute_script php_request_shutdown php_module_shutdown

PHP-FPM

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 change

kill -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也会杀掉

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wsjxdx.html