加入收藏 | 设为首页 | 会员中心 | 我要投稿 开发网_开封站长网 (http://www.0378zz.com/)- 科技、AI行业应用、媒体智能、低代码、办公协同!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP7实现daemon守护进程分析

发布时间:2022-07-02 16:05:26 所属栏目:PHP教程 来源:互联网
导读:本篇文章主要讲述的是用PHP7实现daemon守护进程,具有一定的参考价值,感兴趣的朋友可以了解一下。 在一个多任务的计算机操作系统中,守护进程是一种在后台执行的计算机程序。此类程序会被以进程的形式初始化。守护进程程序的名称通常以字母d结尾:例如,sys
  本篇文章主要讲述的是用PHP7实现daemon守护进程,具有一定的参考价值,感兴趣的朋友可以了解一下。
 
  在一个多任务的计算机操作系统中,守护进程是一种在后台执行的计算机程序。此类程序会被以进程的形式初始化。守护进程程序的名称通常以字母“d”结尾:例如,syslogd就是指管理系统日志的守护进程。
 
  daemon 程序是一直运行的服务端程序,又称为守护进程。通常在系统后台运行,没有控制终端不与前台交互,daemon 程序一般作为系统服务使用。daemon 是长时间运行的进程,通常在系统启动后就运行,在系统关闭时才结束。一般说Daemon程序在后台运行,是因为它没有控制终端,无法和前台的用户交互。daemon程序一般都作为服务程序使用,等待客户端程序与它通信。我们也把运行的daemon程序称作守护进程。
 
 
  假如有个耗时间的任务需要跑在后台 : 将所有mysql中user表中的2000万用户全部导入到redis中做预热缓存 , 那么这个任务估计一时半会是不会结束的 , 这个时候就需要编写一个php脚本以daemon形式运行在系统中 , 结束后自动推出。
 
  在Linux中 , 有三种方式实现脚本后台化 :
 
  1 . 在命令后添加一个&符号
 
  比如 php task.php & . 这个方法的缺点在于 如果terminal终端关闭 , 无论是正常关闭还是非正常关闭 , 这个php进程都会随着终端关闭而关闭 , 其次是代码中如果有echo或者print_r之类的输出文本 , 会被输出到当前的终端窗口中 。
 
  2 . 使用nohup命令
 
  比如 nohup php task.php & . 默认情况下 , 代码中echo或者print_r之类输出的文本会被输出到php代码同级目录的nohup.out文件中 . 如果你用exit命令或者关闭按钮等正常手段关闭终端 , 该进程不会被关闭 , 依然会在后台持续运行 . 但是如果终端遇到异常退出或者终止 , 该php进程也会随即退出 . 本质上 , 也并非稳定可靠的daemon方案 。
 
  3 . 通过 pcntl 与 posix 扩展实现
 
  编程中需要注意的地方有:
 
  通过二次 pcntl_fork() 以及 posix_setsid 让主进程脱离终端
 
  通过 pcntl_signal() 忽略或者处理 SIGHUP 信号
 
  多进程程序需要通过二次 pcntl_fork() 或者 pcntl_signal() 忽略 SIGCHLD 信号防止子进程变成 Zombie 进程
 
  通过 umask() 设定文件权限掩码,防止继承文件权限而来的权限影响功能
 
  将运行进程的 STDIN/STDOUT/STDERR 重定向到 /dev/null 或者其他流上
 
  daemon有如下特征:
 
  没有终端
 
  后台运行
 
  PHP 中的 pcntl 扩展中实现了 pcntl_fork() 函数,用于在 PHP 中 fork 新的进程。
 
  setsid 系统调用
 
  setsid 系统调用则用于创建一个新的会话并设定进程组 id。这里有几个概念:会话,进程组。
 
  在 Linux 中,用户登录产生一个会话(Session),一个会话中包含一个或者多个进程组,一个进程组又包含多个进程。每个进程组有一个组长(Session Leader),它的 pid 就是进程组的组 id。进程组长一旦打开一个终端,这一个终端就被称为控制终端。一旦控制终端发生异常(断开、硬件错误等),会发出信号到进程组组长。
 
  后台运行程序(如 shell 中以&结尾执行指令)在终端关闭之后也会被杀死,就是没有处理好控制终端断开时发出的SIGHUP信号,而SIGHUP信号对于进程的默认行为则是退出进程。
 
  调用 setsid 系统调用之后,会让当前的进程新建一个进程组,如果在当前进程中不打开终端的话,那么这一个进程组就不会存在控制终端,也就不会出现因为关闭终端而杀死进程的问题。
 
  PHP 中的 posix 扩展中实现了 posix_setsid() 函数,用于在 PHP 中设定新的进程组。

(编辑:开发网_开封站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读