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 相关文章推荐
实用函数3
Nov 08 PHP
FleaPHP的安全设置方法
Sep 15 PHP
上传文件先创建目录 再上传到目录里面去
Dec 29 PHP
PHP中nowdoc和heredoc使用需要注意的一点
Mar 21 PHP
Win2003+apache+PHP+SqlServer2008 配置生产环境
Jul 29 PHP
PHP实现可自定义样式的分页类
Mar 29 PHP
PHP文件上传类实例详解
Apr 08 PHP
PHP自定义图片缩放函数实现等比例不失真缩放的方法
Aug 19 PHP
Laravel框架中缓存的使用方法分析
Sep 06 PHP
Thinkphp5.0 框架实现控制器向视图view赋值及视图view取值操作示例
Oct 12 PHP
解决Laravel无法使用COOKIE和SESSION的问题
Oct 16 PHP
Laravel实现通过blade模板引擎渲染视图
Oct 25 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的错误信息
2006/10/09 PHP
PHPMailer安装方法及简单实例
2008/11/25 PHP
PHP容易被忽略而出错陷阱 数字与字符串比较
2011/11/10 PHP
php常用表单验证类用法实例
2015/06/18 PHP
PHP通过反射动态加载第三方类和获得类源码的实例
2015/11/27 PHP
PHP htmlspecialchars()函数用法与实例讲解
2019/03/08 PHP
js 返回时间戳所对应的具体时间
2010/07/20 Javascript
DLL+ ActiveX控件+WEB页面调用例子
2010/08/07 Javascript
JQuery $.each遍历JavaScript数组对象实例
2014/09/01 Javascript
使用javascript实现Iframe自适应高度
2014/12/24 Javascript
JavaScript中的Math.LOG2E属性使用详解
2015/06/14 Javascript
浅谈Javascript事件对象
2017/02/05 Javascript
nodejs 搭建简易服务器的图文教程(推荐)
2017/07/18 NodeJs
微信小程序错误this.setData报错及解决过程
2019/09/18 Javascript
js实现百度登录窗口拖拽效果
2020/03/19 Javascript
JavaScript内置对象之Array的使用小结
2020/05/12 Javascript
[38:41]2014 DOTA2国际邀请赛中国区预选赛 LGD VS CNB
2014/05/22 DOTA
Python设计模式之门面模式简单示例
2018/01/09 Python
分享Pycharm中一些不为人知的技巧
2018/04/03 Python
Windows下anaconda安装第三方包的方法小结(tensorflow、gensim为例)
2018/04/05 Python
python如何删除文件中重复的字段
2019/07/16 Python
python获取栅格点和面值的实现
2020/03/10 Python
Python如何基于Tesseract实现识别文字功能
2020/06/05 Python
SEPHORA新西兰官方网站:购买化妆品和护肤品
2016/12/02 全球购物
阿姆斯特丹杜莎夫人蜡像馆官方网站:Madame Tussauds Amsterdam
2019/03/12 全球购物
泰国第一在线超市:Tops
2021/02/13 全球购物
大专计算机个人求职的自我评价
2013/10/21 职场文书
标准自荐信范文
2014/01/29 职场文书
《列夫托尔斯泰》教学反思
2014/02/10 职场文书
和解协议书
2014/04/16 职场文书
计算机系统管理员求职信
2014/06/20 职场文书
动物科学专业求职信
2014/07/27 职场文书
大型主题婚礼活动策划方案
2014/09/15 职场文书
领导班子四风对照检查材料范文
2014/09/27 职场文书
道德模范事迹材料
2014/12/20 职场文书
SpringCloud项目如何解决log4j2漏洞
2022/04/10 Java/Android