php实现守护进程
PHP 实现守护进程的方法
在 PHP 中实现守护进程(Daemon)通常需要脱离终端、忽略信号、创建子进程并脱离进程组。以下是具体实现方法:
使用 pcntl 扩展
确保 PHP 已安装 pcntl 扩展,这是实现守护进程的核心扩展。
<?php
// 创建子进程
$pid = pcntl_fork();
if ($pid < 0) {
exit('Fork failed');
} elseif ($pid > 0) {
exit(); // 父进程退出
}
// 脱离终端
if (posix_setsid() < 0) {
exit('Set sid failed');
}
// 忽略信号
pcntl_signal(SIGTERM, SIG_IGN);
pcntl_signal(SIGHUP, SIG_IGN);
// 再次 fork 避免重新获取终端
$pid = pcntl_fork();
if ($pid < 0) {
exit('Fork failed');
} elseif ($pid > 0) {
exit(); // 父进程退出
}
// 设置工作目录
chdir('/');
// 重设文件掩码
umask(0);
// 关闭标准输入输出
fclose(STDIN);
fclose(STDOUT);
fclose(STDERR);
// 守护进程主逻辑
while (true) {
// 业务代码
sleep(1);
}
?>
使用 nohup 命令
如果无法使用 pcntl 扩展,可以通过 nohup 命令实现简单的守护进程:

nohup php your_script.php > /dev/null 2>&1 &
使用 Supervisor 管理
对于生产环境,建议使用 Supervisor 管理守护进程:
-
安装 Supervisor:

sudo apt-get install supervisor -
配置 Supervisor:
[program:your_daemon] command=php /path/to/your_script.php autostart=true autorestart=true stderr_logfile=/var/log/your_daemon.err.log stdout_logfile=/var/log/your_daemon.out.log -
启动服务:
sudo supervisorctl reread sudo supervisorctl update sudo supervisorctl start your_daemon
注意事项
- 确保 PHP 脚本中没有直接输出内容到终端。
- 守护进程应正确处理信号,实现优雅退出。
- 生产环境建议配合日志系统记录运行状态。
- 长时间运行的进程需注意内存泄漏问题。






