php实现守护进程
PHP 实现守护进程的方法
在 PHP 中实现守护进程(Daemon)通常需要遵循一些特定的步骤,确保进程在后台运行且不受终端关闭的影响。以下是几种常见的方法:
使用 pcntl_fork 创建守护进程
<?php
// 创建子进程
$pid = pcntl_fork();
if ($pid == -1) {
die('Could not fork');
} elseif ($pid) {
// 父进程退出
exit();
} else {
// 子进程继续执行
posix_setsid(); // 设置新会话组长
chdir('/'); // 切换工作目录
umask(0); // 重置文件权限掩码
// 关闭标准输入输出
fclose(STDIN);
fclose(STDOUT);
fclose(STDERR);
// 守护进程逻辑
while (true) {
// 业务代码
sleep(1);
}
}
?>
使用 nohup 命令运行 PHP 脚本
nohup php your_script.php > /dev/null 2>&1 &
这种方法不需要修改 PHP 代码,直接通过命令行工具让脚本在后台运行。
使用 Supervisor 管理守护进程
Supervisor 是一个进程管理工具,可以方便地管理 PHP 守护进程。配置示例:
[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
使用 systemd 管理守护进程
对于现代 Linux 系统,可以使用 systemd 创建服务单元文件:
[Unit]
Description=PHP Daemon
[Service]
ExecStart=/usr/bin/php /path/to/script.php
Restart=always
User=www-data
[Install]
WantedBy=multi-user.target
注意事项
- 确保 PHP 安装了 pcntl 扩展(用于进程控制)
- 守护进程应包含适当的日志记录机制
- 考虑实现信号处理(如 SIGTERM)以优雅地关闭进程
- 注意资源泄漏问题,特别是长时间运行的进程
- 对于生产环境,建议使用专门的进程管理工具(如 Supervisor 或 systemd)
实际应用示例
<?php
// 简单的守护进程示例
function daemonize()
{
$pid = pcntl_fork();
if ($pid == -1) {
die('Fork failed');
} elseif ($pid) {
exit(); // 退出父进程
}
posix_setsid();
chdir('/');
umask(0);
// 重定向标准IO
global $stdin, $stdout, $stderr;
fclose(STDIN); $stdin = fopen('/dev/null', 'r');
fclose(STDOUT); $stdout = fopen('/tmp/daemon.log', 'ab');
fclose(STDERR); $stderr = fopen('/tmp/daemon.error.log', 'ab');
}
daemonize();
// 守护进程主循环
while (true) {
file_put_contents('/tmp/daemon.log', date('Y-m-d H:i:s')."\n", FILE_APPEND);
sleep(5);
}
?>






