PHP项目常驻进程如何守护运行

wen PHP项目 23

本文目录导读:

PHP项目常驻进程如何守护运行

  1. 1️⃣ Supervisor(最推荐)
  2. 2️⃣ Systemd(Linux原生)
  3. 3️⃣ Docker(容器化方案)
  4. 4️⃣ PM2(Node.js工具,但支持PHP)
  5. 5️⃣ 自制守护脚本(简单场景)
  6. 6️⃣ Swoole(高性能方案)
  7. 最佳实践建议
  8. 常驻进程注意事项
  9. 简易监控脚本

对于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 协程支持,性能极佳

常驻进程注意事项

  1. 内存管理:定期释放资源,避免内存泄漏
  2. 错误处理:捕获所有异常,记录日志
  3. 信号处理:正确处理 SIGTERM、SIGINT 等信号
  4. 心跳检测:监控进程是否正常
  5. 重启策略:失败自动重启,启动间隔控制
  6. 日志轮转:避免日志文件无限增长

简易监控脚本

#!/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常驻进程管理的最佳选择。

抱歉,评论功能暂时关闭!