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常用数组array函数实例总结【赋值,拆分,合并,计算,添加,删除,查询,判断,排序】

    下面我将详细讲解php常用数组array函数实例总结。 1. 数组赋值的常用方式 1.1 直接赋值 通过直接赋值的方式来创建一个数组,包括两种形式: // 键值对数组 $arr1 = [‘name’ => ‘Tom’, ‘age’ => 18, ‘gender’ => ‘male’]; // 索引数组 $arr2 = [‘apple’, ‘…

    PHP 2023年5月26日
    00
  • PHP中extract()函数的定义和用法

    这里是“PHP中extract()函数的定义和用法”的完整攻略。 1.函数定义 extract() 是 PHP 内置函数,在 PHP 5、PHP 7 中都有支持。它的作用是将数组中的键名作为变量名,将键值作为变量值。函数定义如下: extract(array $array, int $flags = EXTR_OVERWRITE, string $prefi…

    PHP 2023年5月25日
    00
  • 详解PHP字符串替换str_replace()函数四种用法

    下面我来详细讲解一下“详解PHP字符串替换str_replace()函数四种用法”的完整攻略。 一、概述 在PHP程序中,我们经常需要对字符串进行一些替换操作,比如将字符串中的某些字符替换成另外一些字符。在PHP中,可以使用str_replace()函数来实现字符串替换操作。 二、str_replace()函数的基本用法 str_replace()函数的基本…

    PHP 2023年5月26日
    00
  • 一些 PHP 管理系统程序中的后门

    一些 PHP 管理系统程序中的后门可以被黑客利用,获得对系统的非授权访问权。以下是攻击这些后门的完整攻略: 什么是后门? 后门,指在程序中预留的用于绕过正常认证机制的方法或接口。黑客利用后门可以绕过程序正常的安全机制,获得对系统的非授权访问权。 常见的 PHP 管理系统程序后门 常见的 PHP 管理系统程序后门包括: PHPMyAdmin 后门 ThinkP…

    PHP 2023年5月23日
    00
  • php输出表格的实现代码(修正版)

    绝大多数的网站开发项目需要输出表格,而在PHP应用中,通常我们使用HTML表格标签来完成这一过程。下面是实现输出表格的PHP代码示例,并附有详细的攻略说明。 代码示例 <?php $rows = array( array(‘name’ => ‘李雷’, ‘age’ => 23, ‘gender’ => ‘男’), array(‘nam…

    PHP 2023年5月23日
    00
  • php语法技巧代码实例

    当提到PHP语法技巧时,我们可以谈论各种小技巧和小贴士,以提高开发效率和代码质量。本文将提供一些常见的PHP技巧,以及相应的代码示例。 示例一:使用三元表达式 三元表达式是条件赋值的一种方式,可以使代码更简洁。在PHP中,三元表达式具有以下语法: $variable = (condition) ? true-value : false-value; 在这里,…

    PHP 2023年5月24日
    00
  • 一个简单至极的PHP缓存类代码

    请看下面的攻略: 一、 PHP缓存类是什么? PHP缓存类是一个封装了缓存操作的PHP类,可以有效地提高网站的性能,降低数据库等资源的使用,同时也可以减少代码重复计算的时间和资源消耗。 二、如何编写一个简单至极的PHP缓存类? 首先,定义一个Cache类,并初始化缓存目录和缓存有效期,代码如下所示: class Cache { private $cache_…

    PHP 2023年5月24日
    00
  • php 操作excel文件的方法小结

    下面是“php 操作excel文件的方法小结”的完整攻略: 一、前言 Microsoft Excel 是一款功能强大的电子表格软件,不仅在办公用途中很常用,而且在数据分析和处理方面也有着很广泛的应用。本文介绍如何使用 PHP 来操作 Excel 文件。 二、操作 Excel 文件 1. 使用 PHPExcel 库 PHPExcel 是 PHP 操作 Exce…

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