php守护进程可通过四种方式实现:一、用pcntl_fork和posix_setsid编写标准守护进程;二、用nohup命令后台运行;三、通过systemd注册为系统服务;四、使用supervisor进程管理工具。

如果您希望PHP脚本在Linux系统中脱离终端持续运行,不因SSH断开或用户退出而终止,则需要将其转换为守护进程。以下是实现PHP守护进程的多种方法:
一、使用pcntl_fork和posix_setsid创建标准守护进程
该方法通过创建子进程并使子进程脱离控制终端,成为独立于会话的后台进程。核心步骤包括两次fork、重设会话ID、关闭标准文件描述符、更改工作目录等。
1、在PHP脚本开头检查是否支持pcntl扩展:if (!extension_loaded('pcntl')) { die('pcntl extension is required'); }
2、调用pcntl_fork()创建子进程,父进程立即退出:$pid = pcntl_fork(); if ($pid > 0) { exit(0); }
立即学习“PHP免费学习笔记(深入)”;
3、子进程中调用posix_setsid()创建新会话并成为会话组长:posix_setsid();
4、再次调用pcntl_fork()确保进程不再获得控制终端:$pid2 = pcntl_fork(); if ($pid2 > 0) { exit(0); }
5、关闭标准输入、输出、错误流:fclose(STDIN); fclose(STDOUT); fclose(STDERR);
6、将当前工作目录更改为根目录或指定路径:chdir('/');
7、设置umask为0以避免继承父进程权限掩码:umask(0);
8、进入主循环执行业务逻辑,例如每隔5秒写入日志:while (true) { file_put_contents('/var/log/mydaemon.log', date('Y-m-d H:i:s') . "\n", FILE_APPEND); sleep(5); }
二、使用nohup命令配合php -f启动脚本
该方法无需修改PHP代码,利用shell内置机制使进程忽略挂起信号,并将输出重定向至文件,适用于快速部署简单后台任务。
1、编写纯逻辑PHP脚本(如daemon.php),不包含任何守护化代码,仅含业务循环:while (true) { echo date('c') . "\n"; file_put_contents('log.txt', date('c') . "\n", FILE_APPEND); sleep(10); }
2、在终端中执行nohup命令启动:nohup php -f /path/to/daemon.php > /dev/null 2>&1 &
3、记录返回的进程ID(PID)以便后续管理:echo $! > /var/run/mydaemon.pid
4、验证进程是否运行:ps aux | grep daemon.php
5、停止进程时读取PID文件并kill:kill $(cat /var/run/mydaemon.pid)
三、使用systemd服务单元管理PHP进程
该方法将PHP脚本注册为系统级服务,支持开机自启、自动重启、日志集成与状态监控,适合生产环境长期运行。
1、创建systemd服务文件:sudo vim /etc/systemd/system/php-daemon.service
2、在服务文件中填入以下内容:[Unit]\nDescription=PHP Daemon Service\nAfter=network.target\n\n[Service]\nType=simple\nUser=www-data\nWorkingDirectory=/var/www/html\nExecStart=/usr/bin/php /var/www/html/daemon.php\nRestart=always\nRestartSec=10\nStandardOutput=journal\nStandardError=journal\n\n[Install]\nWantedBy=multi-user.target
3、重新加载systemd配置:sudo systemctl daemon-reload
4、启用服务并立即启动:sudo systemctl enable --now php-daemon.service
5、查看服务状态:sudo systemctl status php-daemon.service
6、查看实时日志:sudo journalctl -u php-daemon.service -f
四、使用Supervisor守护PHP脚本
Supervisor是一个进程控制系统,可监控并自动重启崩溃的PHP进程,同时提供Web界面与命令行工具进行管理。
1、安装supervisor:sudo apt install supervisor
2、创建程序配置文件:sudo vim /etc/supervisor/conf.d/php-daemon.conf
3、写入配置项:[program:php-daemon]\ncommand=php /var/www/html/daemon.php\ndirectory=/var/www/html\nuser=www-data\nautostart=true\nautorestart=true\nredirect_stderr=true\nstdout_logfile=/var/log/php-daemon.log
4、更新Supervisor配置:sudo supervisorctl reread
5、加载新程序:sudo supervisorctl add php-daemon
6、启动程序:sudo supervisorctl start php-daemon
7、查看运行状态:sudo supervisorctl status










