本文目录导读:

- 1️⃣ Supervisor(最推荐)
- 2️⃣ Systemd(Linux原生)
- 3️⃣ Docker(容器化方案)
- 4️⃣ PM2(Node.js工具,但支持PHP)
- 5️⃣ 自制守护脚本(简单场景)
- 6️⃣ Swoole(高性能方案)
- 最佳实践建议
- 常驻进程注意事项
- 简易监控脚本
对于PHP常驻进程的守护运行,有几种成熟方案,我按从推荐到备选的顺序说明:
1️⃣ Supervisor(最推荐)
# 安装 apt-get install supervisor # Ubuntu/Debian yum install supervisor # CentOS # 配置文件 /etc/supervisor/conf.d/worker.conf [program:php-worker] command=php /path/to/worker.php directory=/path/to/project user=www-data numprocs=1 autostart=true autorestart=true startretries=3 stdout_logfile=/var/log/worker_stdout.log stderr_logfile=/var/log/worker_stderr.log
# 管理命令 supervisorctl reread supervisorctl update supervisorctl start php-worker supervisorctl status
2️⃣ Systemd(Linux原生)
# /etc/systemd/system/php-worker.service [Unit] Description=PHP Worker Service After=network.target [Service] Type=simple User=www-data ExecStart=/usr/bin/php /path/to/worker.php Restart=always RestartSec=5 StandardOutput=journal StandardError=journal [Install] WantedBy=multi-user.target
# 管理 systemctl daemon-reload systemctl enable php-worker systemctl start php-worker systemctl status php-worker
3️⃣ Docker(容器化方案)
# Dockerfile FROM php:8.2-cli COPY . /app WORKDIR /app CMD ["php", "worker.php"]
# docker-compose.yml
version: '3'
services:
php-worker:
build: .
restart: always
environment:
- PHP_MEMORY_LIMIT=512M
volumes:
- ./logs:/var/log
4️⃣ PM2(Node.js工具,但支持PHP)
# 安装
npm install -g pm2
# 启动
pm2 start worker.php --interpreter=php --name="php-worker"
# 配置 ecosystem.config.js
module.exports = {
apps: [{
name: 'php-worker',
script: 'worker.php',
interpreter: 'php',
instances: 2,
autorestart: true,
watch: false,
max_memory_restart: '500M'
}]
}
5️⃣ 自制守护脚本(简单场景)
// daemon.php
<?php
class Daemon
{
public function run()
{
while (true) {
try {
// 业务逻辑
$this->process();
// 防止 CPU 100%
sleep(1);
} catch (\Throwable $e) {
// 记录错误日志
error_log($e->getMessage());
// 等待后重试
sleep(5);
}
}
}
private function process()
{
// 你的业务代码
}
}
// 确保作为 CLI 运行
if (php_sapi_name() !== 'cli') {
die("This script must be run from CLI");
}
if (function_exists('cli_set_process_title')) {
cli_set_process_title('php-worker');
}
// 忽略用户中止
ignore_user_abort(true);
// 设置无限执行时间
set_time_limit(0);
// 启动
$daemon = new Daemon();
$daemon->run();
6️⃣ Swoole(高性能方案)
<?php
$server = new Swoole\Process(function() {
while (true) {
// 业务逻辑
sleep(1);
}
}, false, false);
$server->start();
// 监听信号
\Swoole\Process::signal(SIGTERM, function() use ($server) {
$server->exit(0);
});
\Swoole\Process::wait();
最佳实践建议
| 场景 | 推荐方案 | 原因 |
|---|---|---|
| 传统服务器 | Supervisor | 成熟稳定,配置简单 |
| 云原生/新项目 | Docker + Supervisor | 环境隔离,便于部署 |
| 单一服务器简单场景 | Systemd | 无需额外安装 |
| 已有Node环境 | PM2 | 功能丰富,监控完善 |
| 高性能需求 | Swoole | 协程支持,性能极佳 |
常驻进程注意事项
- 内存管理:定期释放资源,避免内存泄漏
- 错误处理:捕获所有异常,记录日志
- 信号处理:正确处理 SIGTERM、SIGINT 等信号
- 心跳检测:监控进程是否正常
- 重启策略:失败自动重启,启动间隔控制
- 日志轮转:避免日志文件无限增长
简易监控脚本
#!/bin/bash
# monitor.sh - 每5分钟检查进程
while true; do
if ! pgrep -f "worker.php" > /dev/null; then
echo "$(date): Worker died, restarting..."
nohup php /path/to/worker.php > /dev/null 2>&1 &
fi
sleep 300
done
我个人强烈推荐 Supervisor,它在生产环境中经过了充分验证,配置直观,功能完善,是PHP常驻进程管理的最佳选择。