php7中停止php-fpm服务的方法详解


Posted in PHP onMay 09, 2021

在PHP生命周期的各个阶段,一些与服务相关的操作都是通过SAPI接口实现。

各个服务器抽象层之间遵守着相同的约定,这里我们称之为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

  1. ISAPI模式 (eg Apache : apache2handler mode ) 以web服务器的一个模块加载运行,其实就是将PHP的源码与webServer的代码一起编译,运行时是同一个进程,共享同一个地址空间. 例如 LAMP中,PHP就是作为Apache的一个模块运行的.Apache是多线程调用php模块的.(same as IIS)
  2. CGI模式 fork-and-execute webServer将动态请求转发到CGI程序(以php为例子),就相当于fork一个子进程,然后exec(php process),用CGI程序来解释请求内容,最后将子进程的output返回.此时webServer与php进程的地址空间是独立的.此时的php是作为一个独立的程序运行.
  3. FastCGI模式 这种形式是CGI的加强版本,CGI是单进程,多线程的运行方式,程序执行完成之后就会销毁,所以每次都需要加载配置和环境变量(创建-执行)。
    而FastCGI则不同,FastCGI 是一个常驻 (long-live) 型的 CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去 fork 一次。
  4. 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也会杀掉

[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

apache prefork

总结

到此这篇关于php7中停止php-fpm服务的文章就介绍到这了,更多相关php7停止php-fpm服务内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

PHP 相关文章推荐
PHP执行zip与rar解压缩方法实现代码
Dec 05 PHP
PHP中MVC模式的模板引擎开发经验分享
Mar 23 PHP
php循环语句 for()与foreach()用法区别介绍
Sep 05 PHP
在PHP中设置、使用、删除Cookie的解决方法
May 06 PHP
php生成扇形比例图实例
Nov 06 PHP
php使用mkdir创建多级目录入门例子
May 10 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(七)
Jun 23 PHP
php实现监控varnish缓存服务器的状态
Dec 30 PHP
PHP多线程编程之管道通信实例分析
Mar 07 PHP
round robin权重轮循算法php实现代码
May 28 PHP
yii2.0整合阿里云oss删除单个文件的方法
Sep 19 PHP
Yaf框架封装的MySQL数据库操作示例
Mar 06 PHP
解析laravel使用workerman用户交互、服务器交互
Apr 28 #PHP
PHP实现创建以太坊钱包转账等功能
Apr 21 #PHP
如何使用php生成zip压缩包
Apr 21 #PHP
PHP使用非对称加密算法RSA
laravel ajax curd 搜索登录判断功能的实现
thinkphp 获取控制器及控制器方法
Apr 16 #PHP
PHP连接MSSQL数据库案例,PHPWAMP多个PHP版本连接SQL Server数据库
You might like
用PHP和MySQL保存和输出图片
2006/10/09 PHP
php 执行系统命令的方法
2009/07/07 PHP
ThinkPHP 3.2.3实现页面静态化功能的方法详解
2017/08/03 PHP
PHP+AJAX 投票器功能
2017/11/11 PHP
php使用array_chunk函数将一个数组分割成多个数组
2018/12/05 PHP
javascript实现的鼠标链接提示效果生成器代码
2007/06/28 Javascript
学习ExtJS Window常用方法
2009/10/07 Javascript
ExtJS下grid的一些属性说明
2009/12/13 Javascript
Firefox下提示illegal character并出现乱码的原因
2010/03/25 Javascript
Node.js(安装,启动,测试)
2014/06/09 Javascript
VS2008中使用JavaScript调用WebServices
2014/12/18 Javascript
JSON格式的键盘编码对照表
2015/01/29 Javascript
js实现发送验证码后的倒计时功能
2015/05/28 Javascript
javascript input输入框模糊提示功能的实现
2017/09/25 Javascript
详解webpack之scss和postcss-loader的配置
2018/01/09 Javascript
Vue实现搜索 和新闻列表功能简单范例
2018/03/16 Javascript
基于vue.js组件实现分页效果
2018/12/29 Javascript
小程序获取当前位置加搜索附近热门小区及商区的方法
2019/04/08 Javascript
微信小程序以7天为周期连续签到7天功能效果的示例代码
2020/08/20 Javascript
[02:30]DOTA2放量测试专访海涛:呼吁保护新手玩家
2013/08/26 DOTA
python的几种开发工具介绍
2007/03/07 Python
Python中enumerate函数代码解析
2017/10/31 Python
Django Xadmin多对多字段过滤实例
2020/04/07 Python
Python中的Cookie模块如何使用
2020/06/04 Python
Java基础面试题
2014/07/19 面试题
幼儿园教师考核制度
2014/02/01 职场文书
代理协议书
2014/04/22 职场文书
代理人委托书
2014/09/16 职场文书
单位工作证明书格式
2014/10/04 职场文书
兵马俑的导游词
2015/02/02 职场文书
Java集成swagger文档组件
2021/06/28 Java/Android
java解析XML详解
2021/07/09 Java/Android
yolov5返回坐标的方法实例
2022/03/17 Python
Lakehouse数据湖并发控制陷阱分析
2022/03/31 Oracle
Win11 BitLocker 驱动器加密
2022/04/19 数码科技
Vue组件化(ref,props, mixin,.插件)详解
2022/05/15 Vue.js