php脚本守护进程原理与实现方法详解

yizhihongxing

PHP脚本守护进程原理与实现方法详解

背景

要想实现持续运行某个 PHP 程序,一般常见的方式是在终端执行 php your-script.php 命令,但是这种方式不够优雅,因为无法后台运行,当终端连接关闭时,该 PHP 程序也会随之退出。而守护进程是一种让后台程序持续运行的方式,我们可以借助它来实现 PHP 脚本目标。

原理

守护进程是指一种在操作系统后台长时间运行的进程,它的存在是为了不间断的执行特定任务。它一般父进程完成以下任务:

  1. 创建一个子进程并立即退出,让子进程称为孤儿进程;
  2. 在子进程中调用 setsid() 函数创建新的会话,成为 session leader 且不再有控制终端器;
  3. 再一次创建一个新的子进程,使用 exec() 函数执行真正的代码;
  4. 子进程开始执行,成为渐消进程,就可以长时间运行了。

实现

下面提供基于 PHP 实现守护进程的方法,以 CLI 模式执行 Script 的信息将会记录到 daemon.log 文件中。

#!/usr/bin/env php
<?php

$log_file = __DIR__ . '/daemon.log';

$fp = stream_socket_server('tcp://0.0.0.0:8888', $errno, $errstr);
if (!$fp) {
    exit("Create socket failed: $errstr ($errno)" . PHP_EOL);
}

// 创建子进程
$pid = pcntl_fork();
if ($pid === -1) {
    exit("Fork child process failed!" . PHP_EOL);
} else if ($pid > 0) {
    exit(0);
}

// 当前进程成为会话领导
if (posix_setsid() === -1) {
    exit("Child process create session failed!" . PHP_EOL);
}

// 关闭不必要的文件描述符
fclose(STDIN);
fclose(STDOUT);
fclose(STDERR);

// 重定向标准 IO 流
$STDIN  = fopen('/dev/null', 'r');
$STDOUT = fopen($log_file, 'ab');
$STDERR = fopen($log_file, 'ab');

// 再次创建子进程,禁止进程打开控制终端
$pid = pcntl_fork();
if ($pid === -1) {
    exit("Fork child process failed!" . PHP_EOL);
} else if ($pid > 0) {
    exit(0);
}

// 保存当前进程 ID
if (!file_put_contents(__DIR__ . '/daemon.pid', posix_getpid())) {
    exit("Failed to save pid file!" . PHP_EOL);
}

while (true) {
    // 接收客户端连接
    $client = stream_socket_accept($fp);

    // 处理请求

    fclose($client);
}

以上代码会创建守护进程并监听 8888 端口,收到客户端连接后处理请求并关闭连接。需要注意的是,在本代码示例中:

  • 我们创建了两次子进程,原因是第一次子进程将 session leader 的权限剥夺掉了,以防发生意外情况。
  • 为了避免在后台运行程序时因为 STDIN、STDOUT、STDERR 等文件描述符被关闭而导致崩溃问题,需要将其重定向到 /dev/null 或日志文件等。

示例

以下是一个示例,该示例通过网络发起一个 HTTP 请求,模拟客户端链接,并向 localhost:8888 发送 hello 消息。如果后台程序正常启动,该示例将会得到响应。

<?php

$fp = fsockopen('localhost', 8888, $errno, $errstr, 1);
if (!$fp) {
    echo "$errstr ($errno)" . PHP_EOL;
} else {
    $out = "hello\n";
    fwrite($fp, $out);
    echo fread($fp, 8192);
    fclose($fp);
}

结语

通过上述方法,我们可以使用 PHP 实现守护进程,让程序在后台仍然运行,这种方式有助于提升服务稳定性,完全可以应用在多种实际场景中。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:php脚本守护进程原理与实现方法详解 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • 微信小程序 bindtap 传参的实例代码

    接下来我将详细讲解关于微信小程序 bindtap 传参的实例代码的完整攻略。 了解基础 在讲解 bindtap 传参前,我们需要了解一下 bindtap 的基础知识。 bindtap 是小程序中一个事件绑定的方法,通常用于绑定点击事件。可以通过 data-* 的方式绑定自定义属性,绑定的自定义属性值可以在事件回调函数中通过 event.currentTarg…

    PHP 2023年5月30日
    00
  • PHP 函数call_user_func和call_user_func_array用法详解

    PHP 函数call_user_func和call_user_func_array用法详解 在 PHP 中,我们可以通过调用函数来完成某些操作。但有时候,我们需要在运行时动态地调用函数,这时就可以使用 call_user_func 和 call_user_func_array 函数,本文将对这两个函数的使用方法进行详细讲解。 call_user_func c…

    PHP 2023年5月26日
    00
  • 学习php设计模式 php实现状态模式

    下面是“学习php设计模式 php实现状态模式”的完整攻略。 什么是状态模式 状态模式,也称状态机模式(State Pattern或者State Machine Pattern),是一种行为型设计模式。它允许对象在其内部状态发生变化时改变它的行为,而不是在代码里面用一堆的 if else 来控制。 状态模式可以让代码更清晰、更简洁,并且更容易扩展和维护。它给…

    PHP 2023年5月27日
    00
  • 开源php中文分词系统SCWS安装和使用实例

    开源php中文分词系统SCWS安装和使用实例 一、SCWS简介 SCWS是一款针对中文语言的高效处理系统,它可以对中文进行分词、词性标注、关键词提取等多种处理,是中文自然语言处理领域的重要工具。 二、SCWS安装 1. 准备环境 在安装SCWS之前,需要先确认服务器上已经安装了以下软件: GCC编译器 PHP开发包 Libiconv库 Pcre库 如果没有安…

    PHP 2023年5月23日
    00
  • PHP字符函数大全第1/2页

    首先,对于“PHP字符函数大全第1/2页”的完整攻略,可以分为以下几个部分进行讲解: 概述:对该攻略的目的和涉及到的知识点进行简单介绍,并引导读者进入主题。 字符处理函数:分为字符串函数、字符集函数、正则表达式函数三大类进行介绍。 示例说明:以常用的字符串函数strlen和strpos为例,进行详细的操作说明和代码演示。 注意事项:对使用字符串函数时需要注意…

    PHP 2023年5月23日
    00
  • php中上传文件的的解决方案

    下面我将详细讲解如何在php中上传文件的解决方案。 一、基本概念 在php中,文件上传是指将本地计算机上的文件上传至web服务器中,并保存至指定的路径。文件上传通常会涉及到如下3个步骤: 选择文件:用户通过页面中的file input元素选择需要上传的文件,并点击上传按钮。 将文件发送至web服务器:web浏览器将文件发送至web服务器。 在web服务器上保…

    PHP 2023年5月26日
    00
  • PHP实现会员注册系统

    下面就来详细讲解一下“PHP实现会员注册系统”的完整攻略。 1. 确定需求 在开始搭建会员注册系统之前,我们需要明确该系统的需求以及功能。 一个典型的会员注册系统包括以下功能: 用户注册 用户登录 密码重置 会员信息管理 2. 创建数据库及表格 我们需要创建一个数据库,并为该数据库创建几个表格,用于存储会员相关信息。例如,我们可以创建一个名为“members…

    PHP 2023年5月24日
    00
  • PHP实现的AES 128位加密算法示例

    下面我将详细讲解“PHP实现的AES 128位加密算法示例”的完整攻略。 简介 AES是一种对称加密算法,是目前广泛使用的加密算法之一,其中AES-128是AES算法中使用的一种密钥长度为128位的加密方式。在PHP中,可以使用mcrypt扩展程序来实现AES-128加密算法的加密和解密操作。 准备工作 在使用PHP实现AES-128加密算法之前,需要确保已…

    PHP 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部