php-fpm 为什么不能用 service 重启?

对于 centos 下使用 yum,或者 ubuntu 下使用 apt-get 等软件包管理工具安装的 php 来说,php-fpm 可以以服务的形式运行,直接用 service php-fpm start|stop|reload 指令即可操作控制。

对于源码包编译安装的,php 5.3.3 以后的 php-fpm 不再支持 php-fpm 以前具有的 /your/phpsrcdir/sbin/php-fpm(start|stop|reload) 等命令,此时需要使用信号控制。

php 5.3.3 后的 php-fpm 版本为什么不支持 service 指令?

php-fpm 一开始是作为 php 的扩展独立存在的,通过 yum 等工具安装,以服务形式运行。在 php 5.3.3 之后,php-fpm 直接被嵌入到 php 中,作为 php 源码的一部分。编译安装不会直接将 php-fpm 注册成服务,可以通过 php-fpm 启动进程。

重启 php-fpm 进程

跟 Apache 和 Nginx 一样,在 Linux 环境中 php-fpm 也是采用多进程方式运行,主进程叫 master process,子进程叫 worker process。要重启 php-fpm 可以从主进程入手。

master 进程可以理解以下信号

INT, TERM 立刻终止 
QUIT 平滑终止 
USR1 重新打开日志文件 
USR2 平滑重载所有 worker 进程并重新载入配置和二进制模块

一个简单直接的重启方法:

  • 先查看 php-fpm 的 master 进程号:

    # ps aux|grep php-fpm
    root     21891  0.0  0.0 112660   960 pts/3    R+   16:18   0:00 grep --color=auto php-fpm
    root     42891  0.0  0.1 182796  1220 ?        Ss   4月18   0:19 php-fpm: master process (/Data/apps/php7/etc/php-fpm.conf)
    nobody   42892  0.0  0.6 183000  6516 ?        S    4月18   0:07 php-fpm: pool www
    nobody   42893  0.0  0.6 183000  6508 ?        S    4月18   0:17 php-fpm: pool www

[notice]上面 worker 进程的执行者为 nobody,是由 php-fpm 配置文件决定的,配置项一般在同级目录下 php-fpm.d\www.conf 文件中。[/notice]

  • 重启php-fpm:

    kill -USR2 42891

其他方法:

当然也可以用老办法 kill -9 进程号 分别关闭 master 和其他子进程,或者粗暴一点 pkill php-fpm 关闭所有 php-fpm 相关的进程,然后 /your/phpsrcdir/sbin/php-fpm 启动。

如果不知道 php-fpm 安装目录,可以使用 find / -name php-fpm 查找。若安装目录已添加到 path 中,可以直接 php-fpm 启动。

执行启动指令后,可以用 ps -ef | grep php-fpm 指令查看所属进程是否正常。

参考:我是技术渣 - CSDN