iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 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://www.lsjlt.com/news/329182.html(转载时请注明来源链接)

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

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    • PHP怎么实现守护进程
      今天小编给大家分享一下PHP怎么实现守护进程的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。成为守护进程的步骤其实只需要创建子...
      99+
      2023-06-30
    • python守护进程监控子进程怎么实现
      在Python中,可以使用multiprocessing模块来创建子进程并监控它们。具体实现方法如下: 导入multiproces...
      99+
      2023-10-23
      python
    • Python守护进程daemon实现
      1.1 守护进程 守护进程是系统中生存期较长的一种进程,常常在系统引导装入时启动,在系统关闭时终止,没有控制终端,在后台运行。守护进程脱离于终端是为了避免进程在执行过程中的信息在任何终端上显示并且进程也不会被任何终端所产生的终端信息...
      99+
      2023-01-31
      进程 Python daemon
    • Python实现Daemon(守护)进程
      最近在写Daemon进程,在编写过程中遇到一些小麻烦,最终还是解决了。 我编写了两种,第一种是编写了一个程序,将其用setsid命令让其放入后台运行,第二种是直接fork()一个进程,在代码里将进程设置为后台启动。 在os.sytem()...
      99+
      2023-01-31
      进程 Python Daemon
    • PHP实现守护进程的示例代码
      目录前言成为守护进程的步骤实现说明创建子进程并退出父进程创建新的会话重设文件掩码改变工作目录关闭标准输入输出其他注意事项前言 写 PHP CLI 程序的老司机们可能经常会写一些常驻进...
      99+
      2024-04-02
    • C#守护进程如何实现
      今天小编给大家分享一下C#守护进程如何实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。1、为什么需要守护进程一般是为了保护...
      99+
      2023-07-02
    • python中的daemon守护进程实现
      守护进程是生存期长的一种进程。它们独立于控制终端并且周期性的执行某种任务或等待处理某些发生的事件。他们常常在系统引导装入时启动,在系统关闭时终止。 ...
      99+
      2023-01-31
      进程 python daemon
    • Python 守护进程
       nohup 可以使程序后台运行不受终端影响,但想使程序运行后就脱离终端Python需要用到os.fork来实现,例子如下: daemonize.py #!/usr/bin/python #coding:utf-8  import sys ...
      99+
      2023-01-31
      进程 Python
    • [Linux]----守护进程
      文章目录 前言一、什么是守护进程二、会话和进程组会话进程组 三、守护进程的编程流程四、命令行指令让进程守护化总结总结 前言 这节课我来给大家讲解在Linux下如何让进程守护化,运行在...
      99+
      2023-09-30
      linux 服务器 运维
    • 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 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
    • [转]Python 守护进程
      守护进程:通常被定义为一个后台进程,而且它不属于任何一个终端会话(terminal session)。许多系统服务由守护程序实施;如网络服务,打印等。  下面是转自一位网友写的编写守护进程的步骤: 1. 调用fork()以便父进程可...
      99+
      2023-01-31
      进程 Python
    • linux中怎么创建守护进程
      这期内容当中小编将会给大家带来有关linux中怎么创建守护进程,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。创建子进程,父进程退出   这是编写守护进程的第一步。由于守护进程是脱离控制终端的,因此,完成第...
      99+
      2023-06-09
    • SAP ABAP守护进程的实现方式是什么
      本篇文章给大家分享的是有关SAP ABAP守护进程的实现方式是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。Linux系统很多服务都通过守护进程实现,常见的守护进程有系统日...
      99+
      2023-06-03
    • 如何使linux shell实现守护进程脚本
      这篇文章主要讲解了“如何使linux shell实现守护进程脚本”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使linux shell实现守护进程脚本”吧!#! /bin/sh...
      99+
      2023-06-09
    • php-fpm 如何进程守护,保证进程不死
      php-fpm 如何进程守护,保证进程不死? PHP-FPM 是一个用于处理 PHP 脚本的 FastCGI 进程管理器。它可以与 Nginx、Apache 或其他支持 FastCGI 协议的 Web...
      99+
      2023-09-09
      php 开发语言
    • 如何进行Python进程的守护进程实施
      如何进行Python进程的守护进程实施,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Python进程这一计算机语言在实际的应用中,如果你在实际应用的过程中遇到相...
      99+
      2023-06-17
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作