本文目录导读:

- 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常驻进程管理的最佳选择。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播