当前位置:首页 > 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实现图片上传

实现图片上传的基本步骤 创建HTML表单用于文件上传,表单需设置enctype="multipart/form-data"属性,确保文件数据正确传输。 <form action="upload…

php实现

php实现

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

php实现搜索

php实现搜索

PHP实现搜索功能的方法 在PHP中实现搜索功能通常涉及数据库查询和用户输入的匹配。以下是几种常见的实现方式: 使用MySQL LIKE语句 通过简单的LIKE语句实现基础搜索: $searchT…

php 实现购物车

php 实现购物车

PHP 实现购物车功能 购物车功能是电子商务网站的核心部分,可以通过 PHP 和 Session 或数据库来实现。以下是两种常见的实现方式: 使用 Session 存储购物车数据 Sessi…

php 实现秒杀

php 实现秒杀

PHP 实现秒杀的关键技术 秒杀系统需要解决高并发、超卖、性能瓶颈等问题。以下是实现秒杀的核心方案: 使用 Redis 预减库存 将商品库存提前加载到 Redis 中,通过原子操作保证库存准确性:…

php实现博客

php实现博客

使用PHP实现博客系统 数据库设计 创建数据库表存储博客文章和用户信息。常见的表包括posts(文章)和users(用户)。 CREATE TABLE users ( id INT AUTO…