当前位置:首页 > PHP

php 实现守护进程

2026-03-13 05:57:02PHP

守护进程的基本概念

守护进程(Daemon)是在后台运行、不受终端控制的长期存活进程,通常用于执行周期性任务或服务。PHP 可以通过以下方式实现守护进程。

使用 pcntl_fork 创建子进程

通过 pcntl_fork 创建子进程,父进程退出,子进程继续运行并脱离终端控制:

$pid = pcntl_fork();
if ($pid == -1) {
    die("Could not fork");
} elseif ($pid) {
    exit(); // 父进程退出
} 
// 子进程继续执行

调用 posix_setsid 创建新会话

调用 posix_setsid 使子进程成为会话组长,脱离终端关联:

php 实现守护进程

if (posix_setsid() == -1) {
    die("Could not detach from terminal");
}

关闭标准输入输出

关闭标准输入、输出和错误流,避免与终端交互:

fclose(STDIN);
fclose(STDOUT);
fclose(STDERR);

设置 umask 避免权限问题

修改 umask 确保文件权限不受限制:

php 实现守护进程

umask(0);

更改工作目录

避免占用挂载目录,通常切换到根目录:

chdir('/');

处理信号防止意外终止

注册信号处理器,处理 SIGTERM 等信号:

pcntl_signal(SIGTERM, function ($signo) {
    exit();
});

循环执行任务逻辑

守护进程通常包含一个无限循环执行核心任务:

while (true) {
    // 执行任务逻辑
    sleep(1); // 避免 CPU 占用过高
}

完整示例代码

<?php
// 创建子进程
$pid = pcntl_fork();
if ($pid == -1) {
    die("Could not fork");
} elseif ($pid) {
    exit(); // 父进程退出
}

// 脱离终端控制
if (posix_setsid() == -1) {
    die("Could not detach from terminal");
}

// 关闭标准流
fclose(STDIN);
fclose(STDOUT);
fclose(STDERR);

// 设置权限掩码
umask(0);

// 更改工作目录
chdir('/');

// 信号处理
pcntl_signal(SIGTERM, function ($signo) {
    exit();
});

// 主循环
while (true) {
    file_put_contents('/tmp/daemon.log', date('Y-m-d H:i:s') . "\n", FILE_APPEND);
    sleep(5);
}

注意事项

  • 需确保 PHP 已安装 pcntlposix 扩展。
  • 避免在循环中占用过高 CPU,可通过 sleepusleep 控制执行频率。
  • 日志记录建议使用 syslog 或文件,而非标准输出。
  • 可通过 supervisordsystemd 管理守护进程,增强可靠性。

标签: 进程php
分享给朋友:

相关文章

php实现

php实现

PHP 实现的基本方法 PHP 是一种服务器端脚本语言,广泛用于 Web 开发。以下是 PHP 实现的一些常见方法。 变量与数据类型 PHP 变量以 $ 开头,支持多种数据类型: $nam…

php 购物车实现

php 购物车实现

数据库设计 购物车功能通常需要设计数据库表存储商品和用户信息。常见的表包括products(商品表)、users(用户表)和cart(购物车表)。cart表通常包含字段:id(主键)、user_id(…

php实现的分页

php实现的分页

PHP 实现分页的方法 基本分页逻辑 分页的核心在于计算总页数、当前页码以及数据偏移量。假设每页显示 10 条数据: $current_page = isset($_GET['page']) ? (…

php 实现单点登录

php 实现单点登录

PHP 实现单点登录的方法 单点登录(SSO)允许用户通过一次登录访问多个相互信任的系统。以下是基于 PHP 的实现方案: 基于共享 Session 的方案 在同一个主域名下的子域名间可以通过共享…

php登陆功能实现

php登陆功能实现

实现PHP登录功能 数据库准备 创建一个用户表存储登录信息,基本字段包括用户名、密码(需加密)等: CREATE TABLE users ( id INT AUTO_INCREMENT PR…

php实现重定向

php实现重定向

使用header函数进行重定向 在PHP中,header()函数是实现重定向的常用方法。通过发送HTTP头信息Location,浏览器会自动跳转到指定URL。需确保在调用header()前没有输出任何…