在 CentOS 上配置 PHP 守护进程(Daemon),常见做法有几种,取决于你的使用场景。下面按从简单到规范的方式说明,并给出可直接用的示例。
nohup 或 screen(不推荐生产)适合临时运行 PHP 脚本。
nohup php /path/to/script.php > /var/log/php_daemon.log 2>&1 &
查看进程:
ps -ef | grep script.php
⚠️ 缺点:
systemd(✅ 推荐,CentOS 7+)这是 生产环境最标准做法。
<?php
// /opt/daemon/worker.php
while (true) {
file_put_contents('/tmp/php_daemon.log', date('Y-m-d H:i:s') . PHP_EOL, FILE_APPEND);
sleep(5);
}
⚠️ 实际项目中建议加
pcntl_signal、try/catch、退出条件
vim /etc/systemd/system/php-daemon.service
内容示例:
[Unit]
Description=PHP Daemon Service
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/php /opt/daemon/worker.php
Restart=always
RestartSec=5
User=www
Group=www
StandardOutput=append:/var/log/php-daemon.log
StandardError=append:/var/log/php-daemon.log
[Install]
WantedBy=multi-user.target
如果不知道 PHP 路径:
which php
touch /var/log/php-daemon.log
chown www:www /var/log/php-daemon.log
systemctl daemon-reload
systemctl start php-daemon
systemctl enable php-daemon
查看状态:
systemctl status php-daemon
查看日志:
journalctl -u php-daemon -f
✅ 优点:
适合 多个 PHP 守护进程。
yum install -y epel-release
yum install -y supervisor
vim /etc/supervisord.d/php-daemon.ini
[program:php-daemon]
command=/usr/bin/php /opt/daemon/worker.php
directory=/opt/daemon
autostart=true
autorestart=true
user=www
redirect_stderr=true
stdout_logfile=/var/log/php-daemon.log
systemctl enable supervisord
systemctl start supervisord
管理进程:
supervisorctl status
supervisorctl restart php-daemon
✅ 优点:
使用 pcntl 和 posix:
function daemonize() {
if (pcntl_fork()) exit;
posix_setsid();
if (pcntl_fork()) exit;
fclose(STDIN);
fclose(STDOUT);
fclose(STDERR);
}
⚠️ 不推荐新手直接使用,维护成本高。
| 场景 | 推荐方式 |
|---|---|
| 单进程守护 | ✅ systemd |
| 多进程 / 队列 | ✅ Supervisor |
| 临时测试 | nohup |
| 高性能常驻 | PHP + systemd |
你可以告诉我:
我可以直接给你一份 可复制粘贴的完整配置 ✅