如何保证PHP守护进程的长久运行

公司有部分业务使用了yii2-queue来处理异步任务,运行一段时间后发现 yii2-queue 消费进程会时不时的挂掉,导致业务异常。 一番排查,了解到之前仅仅是通过nohup ./yii queue/listen & 启动了一个消费进程。这样长时间运行,必然会导致yii2-queue消费进程死掉。

由于php的一些特性,长时间运行(1个月左右)很大概率会进程挂掉,或者由于服务器重启等外部原因导致进程终止。 如果期望长期稳定的运行一个php守护进程,必然要引入一些外部的监听方法,在进程挂掉、服务器重启后,能够再次恢复php进程,来保证yii2-queue进程持久运行。

在公司centos服务器上,我采用了Systemd来监听、管理yii2-queue进程。

systemd 是一个 Linux 系统基础组件的集合,提供了一个系统和服务管理器,运行为 PID 1 并负责启动其它程序 ,能够按需启动 按需启动守护进程(daemon)

具体使用步骤:

1.查看一下版本,确保正确安装了Systemd

systemctl --version

2.在/etc/systemd/system/下创建名为yii-queue@.service的进程管理配置文件

[Unit]
Description=Yii Queue Worker %I

#yii-queue服务启动依赖于哪些服务,根据自身需求填写,我这里写的是mysql,network
After=network.target
After=mysql.service
Requires=mysql.service

[Service]
User=www-data
Group=www-data
# 进程启动命令
ExecStart=/usr/bin/php /var/www/my_project/yii queue/listen --verbose
# 重启机制, 可设置的值有: always,on-success,on-failure,on-abnormal
Restart=on-failure

[Install]
WantedBy=multi-user.target

3.加载配置文件,为了使配置生效,需求reload一下配置文件:

systemctl daemon-reload

4.systemd 的一些基本启动命令:

# 启动2个消费进程
systemctl start yii-queue@1 yii-queue@2

# 查看进程状态
systemctl status yii-queue@*

# 终止进程
systemctl stop yii-queue@2

5.开机启动:

systemctl enable yii-queue@1 yii-queue@2

附:systemd详细介绍

发表回复