php进程daemon化的正确实现方法
作者:daisy 发布时间:2023-10-01 09:14:09
前言
daemon 音标 : [‘di:mən] , 中文含义为守护神或精灵的意思 . 其实它还有个意思 : 守护进程 .
Daemon程序是一直运行的服务端程序,又称为守护进程。通常在系统后台运行,没有控制终端不与前台交互,Daemon程序一般作为系统服务使用。Daemon是长时间运行的进程,通常在系统启动后就运行,在系统关闭时才结束。一般说Daemon程序在后台运行,是因为它没有控制终端,无法和前台的用户交互。Daemon程序一般都作为服务程序使用,等待客户端程序与它通信。我们也把运行的Daemon程序称作守护进程。
每个进程都有一个父进程,子进程退出,父进程能得到子进程退出的状态。
守护进程简单地说就是可以脱离终端而在后台运行的进程 . 这在Linux中是非常常见的一种进程 , 比如apache或者mysql等服务启动后 , 就会以守护进程的方式进驻在内存中 .
以PHP为例 , 假如我有个耗时间的任务需要跑在后台 : 将所有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 . 使用fork和setsid , 我暂且称之为 : *nix解决方案 . 具体看下代码 :
<?php
// 一次fork
$pid = pcntl_fork();
if ( $pid < 0 ) {
exit( ' fork error. ' );
} else if( $pid > 0 ) {
exit( ' parent process. ' );
}
// 将当前子进程提升会会话组组长 这是至关重要的一步
if ( ! posix_setsid() ) {
exit( ' setsid error. ' );
}
// 二次fork
$pid = pcntl_fork();
if( $pid < 0 ){
exit( ' fork error. ' );
} else if( $pid > 0 ) {
exit( ' parent process. ' );
}
// 真正的逻辑代码们 下面仅仅写个循环以示例
for( $i = 1 ; $i <= 100 ; $i++ ){
sleep( 1 );
file_put_contents( 'daemon.log', $i, FILE_APPEND );
}
?>
来源:https://blog.ti-node.com/blog/6343348095782223873


猜你喜欢
- javascript中声明函数的方法有两种:函数声明式和函数表达式.区别如下:1).以函数声明的方法定义的函数,函数名是必须的,而函数表达式
- 一、this指向构造函数实例化对象在上篇文章中,我们提到了使用new和不使用new调用构造函数的区别,如下例:function Benjam
- import wx import imagesclass DemoTaskBarIcon(wx.TaskBarIcon): &nb
- 有时候会碰到需求,将字典来反转,即:字典中的键作为值,而字典中的值作为键。对于字典比较小,可以使用普通方法方法一:使用普通方法转换>&
- 在 PHP 中表示空的map或空数组都是以空数组形式,在转化为json数据时,会将空数组统一 json 序列化成 [],这样就存在
- 阅读上一篇:javascript面向对象编程(二) [Interface,Class.implement 接口及实现]接口规定了一些方法,如
- 1. axis的基本使用axis常常用在numpy和tensorflow中用到,作为对矩阵(张量)进行操作时需要指定的重要参数之一。设定ax
- 有几个原因促使我们使用自定义的select控件来代替原生的select控件:在ie6下select是一个窗口级的元素,绝对定位的层会被sel
- 这是我记得的问题,基本都没答上来,大家知道的教教小弟,咱不能再不会了 1.在js里类的继承一般是类抄写和原型继承混合使用,在extjs的ex
- 1 简介DataFrame是Python中Pandas库中的一种数据结构,它类似excel,是一种二维表。或许说它可能有点像matlab的矩
- 一、jupyter notebook是什么官网的介绍是:Jupyter Notebook是一个Web应用程序,允许您创建和共享包含实时代码,
- 前言:本文的主要内容是介绍Python中 if 语句及其使用,包括条件测试、if -else 语句、if -elif-else 语句以及使用
- python版本: Python 2.7.61: sys是python自带模块. 利用 import 语句输入sys 模块。当执行impor
- 基础环境# +++++ 阿里云OSS开发指南里都有详细的步骤,在这里整理了一下自己需要的东西# 确定开发环境,centOS默认安装了pyth
- JSONJSON 起源JSON 全称 JavaScript Object Notation 。是处理对象文字语法的 JavaScript 编
- 1、唠唠叨叨最近项目中需要Python的打包,看到网上也没有很详细的资料,于是做了一些示例程序。小小的研究了一下,Python如何在Wind
- 在用python进行图像处理时,有时需要遍历numpy数组,下面是遍历数组的方法:[rows, cols] = num.shape for
- 目录产生背景(已经有了存储过程,为什么还要使用自定义函数)发展历史构成使用方法适用范围注意事项疑问 内容产生背景(已经有了存储过程,为什么还
- ASP链接MSSQL2005的链接字符串如下:Provider=SQLNCLI;Server=.\SQLEXPRESS;Database=m
- 关于IE9,微软逐渐提供越来越多的内容。很多人想知道IE9有多少模式和渲染引擎,今天IE项目主管Marc Silbey就此问题进行了解答。S