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

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日

相关文章

  • 详解如何利用PHP实现RPC

    利用 PHP 实现 RPC 首先需要了解何谓 RPC。RPC(Remote Procedure Call,远程过程调用)是一种进程间通信方式。其思路是:A 机器上的程序通过调用某个远程主机 B 上的程序(即服务),就像调用本地程序一样,而屏蔽了底层网络通信的细节。 下面就是利用 PHP 实现 RPC 的完整攻略: 1. 安装必要的扩展 首先,在 PHP 中实…

    PHP 2023年5月27日
    00
  • php curl发起get与post网络请求案例详解

    PHP Curl发起GET与POST网络请求案例详解 什么是Curl Curl是一个命令行工具和库,用于实现客户端和服务器之间的数据传输。Curl支持绝大多数的协议和网络协议,包括HTTP、FTP、POP3、IMAP、SCP、SMTP等。Curl是一个非常强大的工具,也被广泛应用于各个领域的开发工作中。 Curl也是PHP的一个扩展,PHP Curl可以方便…

    PHP 2023年5月27日
    00
  • PHP实现AES256加密算法实例

    下面是详细的讲解“PHP实现AES256加密算法实例”的攻略。 一、AES256加密算法简介 AES是Advanced Encryption Standard的缩写,中文名为高级加密标准,是一种对称加密算法。AES密钥长度可以为128位、192位或256位,这里我们介绍的是AES256。AES256加密算法在密码学领域是一种较为常见的加密方式,其加密和解密使…

    PHP 2023年5月27日
    00
  • PHP中IP地址与整型数字互相转换详解

    PHP中IP地址与整型数字互相转换是一个常用的操作,在网络编程和服务器管理中都有广泛的应用。在本文中,我们将详细讲解如何进行IP地址与整型数字的互相转换,并提供两个示例来说明这个过程。 IP地址和整型数字的定义 IP地址是一个32位的二进制数,用于标识网络中的设备。通常采用分四段,每段用十进制表示,如”192.168.1.1″。 整型数字是一个由32位二进制…

    PHP 2023年5月26日
    00
  • 网站生成静态页面,及网站数据采集的攻、防原理和策略

    网站生成静态页面的攻、防原理与策略 原理 网站生成静态页面是指将动态数据生成静态HTML文件,以提高网站性能和访问速度。攻击者可以通过修改静态页面来实施攻击,从而导致不良后果。静态页面的生成原理是通过模板引擎和数据库等生成,并通过缓存等机制进行优化。 防御策略 对于敏感数据需要进行服务器端渲染,如账号密码等。 禁止通过get方式将动态页面转换为静态页面,只允…

    PHP 2023年5月27日
    00
  • ThinkPHP5实现JWT Token认证的过程(亲测可用)

    以下是关于“ThinkPHP5实现JWTToken认证的过程(亲测可用)”的完整使用攻略: 基础知识 在了解ThinkPHP5实现JWTToken认证的过程之前,需要掌握一些基础知识,包括JWTToken的基本概念、JWTToken的应用场景、JWTToken的优缺点等。以下是一些常见的基础知识: JWTToken的基本概念包括JWTToken的定义、JWT…

    PHP 2023年5月12日
    00
  • PHP实现一维数组与二维数组去重功能示例

    当我们需要处理一组数据时,其中去重操作是非常常见的。在PHP中,可以使用array_unique函数实现一维数组去重,但是对于二维数组,我们需要写一些代码来实现去重操作。下面是实现一维数组与二维数组去重功能的攻略。 实现一维数组去重 在PHP中,我们可以使用array_unique函数实现一维数组的去重操作。下面是一个示例代码: $arr = array(1…

    PHP 2023年5月26日
    00
  • 关于WIN32.EXE变态木马下载器的解决办法

    关于WIN32.EXE变态木马下载器的解决办法 什么是WIN32.EXE变态木马下载器? WIN32.EXE变态木马下载器是一种非常危险的木马病毒,它可以下载其他恶意程序到受害者的计算机上,窃取用户的个人信息、银行账户信息等敏感信息,甚至可以控制用户的计算机。由于其特殊性质,常规的杀毒软件很难检测并清除它的存在。因此,必须采取专门的措施来应对这种木马病毒。 …

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