返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP怎么实现守护进程
  • 374
分享到

PHP怎么实现守护进程

2023-06-30 13:06:34 374人浏览 薄情痞子
摘要

今天小编给大家分享一下PHP怎么实现守护进程的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。成为守护进程的步骤其实只需要创建子

今天小编给大家分享一下PHP怎么实现守护进程的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

    成为守护进程的步骤

    其实只需要创建子进程并退出父进程,将要处理的工作在子进程中进行就可以实现一个守护进程了。但是仅仅是这么做的话,如果后续任务很复杂,或者引入了一些第三方包,那么可能就会出现奇奇怪怪的问题了。

    而在《UNIX环境高级编程》(英语:Advanced Programming in the UNIX Environment,简称APUE)一书中有介绍关于守护进程的编码规范,我们按照规范来实现我们的守护进程就可以避免出现那些奇怪的问题了。而且规范也不复杂,只需要几步就可以了:

    • 创建子进程,退出父进程

    • 子进程创建一个新的会话并成为 session leader

    • 重设文件掩码

    • 改变工作目录

    • 关闭标准输入输出

    实现

    <?phpfunction daemon(){    // [1] 创建子进程    $pid = pcntl_fork();    if ($pid == -1) {        die('fork failed');    }    // [2] 如果是父进程,则退出    if ($pid > 0) {        exit(0);    }    ///////////////// 以下是子进程 /////////////////    // [3] 创建一个新的会话并成为 session leader    if ( ($sid = posix_setsid()) <= 0 ) {        die("Set sid failed.\n");    }    // [4] 重设文件掩码    umask(0);    // [5] 改变工作目录    if (chdir('/') === false) {        die("chdir failed.\n");    }    // [6] 关闭标准输入输出    fclose(STDIN);    fclose(STDOUT);    fclose(STDERR);}daemon();// ... 真正的处理逻辑

    说明

    上面短短的十几二十行代码就实现了一个守护进程,接下来解释一下有些步骤为什么要这么做。

    创建子进程并退出父进程

    pcntl_fork() 的返回值有三种情况,上面的代码([1]和[2])已经处理了对应的情况。

    创建新的会话

    调用 posix_setsid() 创建新会话会使得当前进程成为新会话中的“会话首进程”,同时也会使当前进程成为“进程组组长”,并且使得当前进程脱离控制终端。

    重设文件掩码

    调用 umask() 重设文件掩码,这里通常是 0。为什么是 0 而不是其他呢,因为子进程从父进程继承来的文件掩码可能会屏蔽某些特定的文件操作权限。比如说引入的第三方库可能需要用特定的权限来创建文件,并且它没有将文件权限作为一个选项参数由你指定,那么就可能会出现失败的情况;而我们传入 0,会使得从调用了 umask() 之后,守护进程创建的文件权限为 0666,目录权限为 0777,均为最高权限。

    关于 umask() 后面会展开新的篇幅来说明,感兴趣的可以先自行搜索资料学习

    改变工作目录

    通过 chdir() 我们将工作目录设置为根目录 /,主要是因为守护进程是长时间运行的,通常只有系统关闭/重启才会退出。假如从父进程继承来的工作目录是个挂载的文件系统,如果不改变工作目录,那么将会导致这个挂载的文件系统一直没法卸载。

    当然也不一定要将工作目录切换到根目录,你也可以根据实际情况切换到特定的目录。

    关闭标准输入输出

    因为守护进程是脱离终端控制的,所以是没有标准输入输出交互的,我们将其关闭即可。

    其他

    二次 fork

    你可能在一些资料中看到有人推荐你在 [3] 创建一个新的会话并成为 session leader 之后再次进行 fork。这一步骤是在基于 System V 的系统中,可以保证你的守护进程不是“会话首进程”,可以阻止其重新申请获取一个控制终端。

    关闭不必要的文件描述符

    按照编码规范,实际还有一步是关闭不必要的文件描述符。但我们为了简单起见,上面的代码在进程启动之后先创建守护进程再执行其他操作,因此这里只打开了三个文件描述符: 01 和 2(即标准输入、标准输出、标准错误)。

    注意事项

    因为上面的代码将标准输入输出关闭了,也就是说如果你在 daemon() 之后有诸如 echo "Hello world"; 之类的输出,那么你的程序将会出错然后退出,并且你将看不到任何错误信息(因为标准错误也被关闭了)。

    解决方案有两种,一种是用 file_put_contents 代替 echo,但是这样并不优雅,而且万一引入的第三方包中写了 echo 或者是 file_put_contents(STDOUT, ...),那你的程序也会“莫名其妙”就挂了,会让你排查半天到底是哪里出了问题。

    因此我们还可以在第[6]之后加入:

    // [7] 重定向输入输出    global $stdin, $stdout, $stderr;    $stdin = fopen('/dev/null', 'r');    $stdout = fopen('/dev/null', 'wb'); // 你也可以将标准输出重定向到指定的文件,相当于是日志    $stderr = fopen('/dev/null', 'wb'); // 同上

    以上就是“PHP怎么实现守护进程”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网PHP编程频道。

    --结束END--

    本文标题: PHP怎么实现守护进程

    本文链接: https://lsjlt.com/news/329182.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • PHP怎么实现守护进程
      今天小编给大家分享一下PHP怎么实现守护进程的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。成为守护进程的步骤其实只需要创建子...
      99+
      2023-06-30
    • python守护进程监控子进程怎么实现
      在Python中,可以使用multiprocessing模块来创建子进程并监控它们。具体实现方法如下: 导入multiproces...
      99+
      2023-10-23
      python
    • python daemon守护进程实现
      假如写一段服务端程序,如果ctrl+c退出或者关闭终端,那么服务端程序就会退出,于是就想着让这个程序成为守护进程,像httpd一样,一直在后端运行,不会受终端影响。 守护进程英文为daemon,像httpd...
      99+
      2022-06-04
      进程 python daemon
    • Python实现Daemon(守护)进程
      最近在写Daemon进程,在编写过程中遇到一些小麻烦,最终还是解决了。 我编写了两种,第一种是编写了一个程序,将其用setsid命令让其放入后台运行,第二种是直接fork()一个进程,在代码里将进程设置为后台启动。 在os.sytem()...
      99+
      2023-01-31
      进程 Python Daemon
    • Python守护进程daemon实现
      1.1 守护进程 守护进程是系统中生存期较长的一种进程,常常在系统引导装入时启动,在系统关闭时终止,没有控制终端,在后台运行。守护进程脱离于终端是为了避免进程在执行过程中的信息在任何终端上显示并且进程也不会被任何终端所产生的终端信息...
      99+
      2023-01-31
      进程 Python daemon
    • PHP实现守护进程的示例代码
      目录前言成为守护进程的步骤实现说明创建子进程并退出父进程创建新的会话重设文件掩码改变工作目录关闭标准输入输出其他注意事项前言 写 PHP CLI 程序的老司机们可能经常会写一些常驻进...
      99+
      2024-04-02
    • C#守护进程如何实现
      今天小编给大家分享一下C#守护进程如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、为什么需要守护进程一般是为了保护...
      99+
      2023-07-02
    • linux shell实现守护进程脚本
      嵌入式初学者,第一次上传代码。昨天做了一个udhcpd与udhcpc的守护,目前只会用shell模仿编写,还有什么方法可以做守护呢? #! /bin/sh #进程名字可修改 PRO_NAME=udhcp...
      99+
      2022-06-04
      脚本 进程 linux
    • Android通过JNI实现守护进程
      开发一个需要常住后台的App其实是一件非常头疼的事情,不仅要应对国内各大厂商的ROM,还需要应对各类的安全管家...虽然不断的研究各式各样的方法,但是效果并不好,比如任务管理器...
      99+
      2022-06-06
      进程 jni Android
    • python中的daemon守护进程实现
      守护进程是生存期长的一种进程。它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。他们常常在系统引导装入时启动,在系统关闭时终止。 ...
      99+
      2023-01-31
      进程 python daemon
    • linux 守护进程详解及建立守护进程
      linux 守护进程详解及建立守护进程 守护进程是一种后台运行并且独立于所有终端控制之外的进程。   守护进程的启动   要启动一个守护进程,可以采取一下几种方式: 在系统期间通过系统的初始化脚本启动...
      99+
      2022-06-04
      进程 详解 linux
    • [Linux]----守护进程
      文章目录 前言一、什么是守护进程二、会话和进程组会话进程组 三、守护进程的编程流程四、命令行指令让进程守护化总结总结 前言 这节课我来给大家讲解在Linux下如何让进程守护化,运行在...
      99+
      2023-09-30
      linux 服务器 运维
    • Python 守护进程
       nohup 可以使程序后台运行不受终端影响,但想使程序运行后就脱离终端Python需要用到os.fork来实现,例子如下: daemonize.py #!/usr/bin/python #coding:utf-8  import sys ...
      99+
      2023-01-31
      进程 Python
    • python守护进程
      假如写一段服务端程序,如果ctrl+c退出或者关闭终端,那么服务端程序就会退出,于是就想着让这个程序成为守护进程,像httpd一样,一直在后端运行,不会受终端影响。守护进程英文为daemon,像httpd,mysqld,最后一个字母d其实就...
      99+
      2023-01-31
      进程 python
    • linux守护进程怎么创建
      这篇文章主要讲解了“linux守护进程怎么创建”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“linux守护进程怎么创建”吧!在linux中,守护进程也称“精灵进程”,是一个在后台运行且不受任...
      99+
      2023-06-29
    • linux守护进程怎么启动
      在Linux中,守护进程的启动通常有以下几种方式: 使用命令行启动:在终端中使用命令行启动守护进程,例如: ./daemon ...
      99+
      2023-10-23
      linux
    • [转]Python 守护进程
      守护进程:通常被定义为一个后台进程,而且它不属于任何一个终端会话(terminal session)。许多系统服务由守护程序实施;如网络服务,打印等。  下面是转自一位网友写的编写守护进程的步骤: 1. 调用fork()以便父进程可...
      99+
      2023-01-31
      进程 Python
    • Python setdaemon守护进程
      setdaemon守护进程#_*_coding:utf-8_*_ __author__ = 'gaogd' import time import threading ''' 守护进程,如果主线程down了,子线程也就没有了。 下...
      99+
      2023-01-31
      进程 Python setdaemon
    • python 守护进程(daemon)
      守护进程的编写步骤: 1、fork子进程,然后父进程退出,此时子进程会被init进程接管。 2、修改子进程的工作目录,创建新进程组合新会话,修改umask。 3、子进程再次fork一个进程,这个进程可以称为孙子进程,然后子进程退出。 4、重...
      99+
      2023-01-31
      进程 python daemon
    • linux中怎么创建守护进程
      这期内容当中小编将会给大家带来有关linux中怎么创建守护进程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。创建子进程,父进程退出   这是编写守护进程的第一步。由于守护进程是脱离控制终端的,因此,完成第...
      99+
      2023-06-09
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作