PHP守护进程化在C和PHP环境下的实现


Posted in PHP onNovember 21, 2017

本文为大家介绍了一下PHP守护进程化在C环境以及PHP环境下实现的方法以及实例代码,一起来学习一下。

什么是守护进程?

一个守护进程通常补认为是一个不对终端进行控制的后台任务。它有三个很显著的特征:在后台运行,与启动他的进程脱离,无须控制终端。常用的实现方式是fork() -> setsid() -> fork()

在glibc里有一个函数daemon。调用此函数,就可使当前进程脱离终端变成一个守护进程,具体内容参见man daemon。PHP中暂时没有此函数,PHP程序实现守护进程化有2种方法:

1.使用系统命令nohup

nohup php myprog.php > log.txt 这样执行程序虽然也是转为后台运行,但实际上是依赖终端的,当用户退出终端时进程就会被杀掉。需要使用nohup来实现

2.使用supervisor工具 (推荐此方案)

3.当然也可以用程序实现(不建议生产环境使用) C程序实现:

#include 
#include 
#include 
#include 
#include 
#include 

//实现守护进程步骤
void crete_daemon(void)
{
pid_t pid = 0;
pid = fork();
if (pid<0)
{
perror("fork");
exit(-1);
}
if (pid > 0)
{
//1.父进程直接退出
exit(0);
}
//2.
//执行到这里就是子进程
//setsid 将当前进程设置为一个新的会话期session,目的就是
//让当前进程脱离控制台,成为守护进程。
pid = setsid();
if (pid < 0)
{
perror("setsid");
exit(-1);
}
//3.设置当前进程的工作目录为根目录,不依赖于其他
chdir("/");
//4.umask设置为0确保将来进程有最大的文件操作权限
umask(0);
//5.关闭文件描述符
//先要获取当前系统中所允许打开的最大文件描述符数目
int i = 0;
int cnt = sysconf(_SC_OPEN_MAX);
for (i=0;i

测试结果:

PHP守护进程化在C和PHP环境下的实现

守护进程:

PHP守护进程化在C和PHP环境下的实现

这里较为关键的二个php函数是pcntl_fork()和posix_setsid()

fork()一个进程,则表示创建了一个运行进程的副本,副本被认为是子进程,而原始进程被认为是父进程。当fork()运行之后,则可以脱离启动他的进程与终端控制等,也意味着父进程可以自由退出。 setsid(),它首先使新进程成为一个新会话的“领导者”,最后使该进程不再控制终端,这也是成为守护进程最关键的一步,这意味着,不会随着终端关闭而强制退出进程。对于一个不会被中断的常驻进程来说,这是很关键的一步。进行最后一次fork(),这一步不是必须的,但通常都这么做,它最大的意义是防止获得控制终端。(在直接打开一个终端设备,而且没有使用O_NOCTTY标志的情况下, 会获得控制终端)

其它事项说明:

chdir() 守护进程默认继承了父进程的当前工作目录,当系统磁盘发生umount时将造成诸多的麻烦,通常将”/” 作为守护进程的当前工作目录,可以避免上述的问题 umask() 守护进程默认继承了父进程的文件权限掩码,这就给该子进程使用文件带来了诸多的麻烦。因此,把文件权限掩码设置为0,可以大大增强该守护进程的灵活性 fclose(STDIN), fclose(STDOUT), fclose(STDERR) 关闭标准I/O流。用fork函数新建的子进程会从父进程那里继承一些已经打开了的文件。这些被打开的文件可能永远不会被守护进程读写,但它们一样消耗系统资源,而且可能导致所在的文件系统无法卸下。

PHP 相关文章推荐
完美解决dedecms中的[html][/html]和[code][/code]问题
Mar 20 PHP
解析PHP留言本模块主要功能的函数说明(代码可实现)
Jun 25 PHP
table标签的结构与合并单元格的实现方法
Jul 24 PHP
php生成图形(Libchart)实例
Nov 06 PHP
php对二维数组进行排序的简单实例
Dec 19 PHP
PHP、Python和Javascript的装饰器模式对比
Feb 03 PHP
php中有关合并某一字段键值相同的数组合并的改进
Mar 10 PHP
PHP统计目录中文件以及目录中目录大小的方法
Jan 09 PHP
PHP和MySql中32位和64位的整形范围是多少
Feb 18 PHP
总结PHP删除字符串最后一个字符的三种方法
Aug 30 PHP
支付宝支付开发――当面付条码支付和扫码支付实例
Nov 04 PHP
PHP jpgraph库的配置及生成统计图表:折线图、柱状图、饼状图
May 15 PHP
php实现获取农历(阴历)、节日、节气的类与用法示例
Nov 20 #PHP
详解php语言最牛掰的Laravel框架
Nov 20 #PHP
PHP实现UTF8二进制及明文字符串的转化功能示例
Nov 20 #PHP
PHP实现在对象之外访问其私有属性private及保护属性protected的方法
Nov 20 #PHP
PHP空值检测函数与方法汇总
Nov 19 #PHP
使用PHPStorm+XDebug搭建单步调试环境
Nov 19 #PHP
php利用云片网实现短信验证码功能的示例代码
Nov 18 #PHP
You might like
php 冒泡排序 交换排序法
2011/05/10 PHP
关于php mvc开发模式的感想
2011/06/28 PHP
php四种基础算法代码实例
2013/10/29 PHP
php实现执行某一操作时弹出确认、取消对话框
2013/12/30 PHP
php获取系统变量方法小结
2015/05/29 PHP
php基于curl实现随机ip地址抓取内容的方法
2016/10/11 PHP
Yii2实现跨mysql数据库关联查询排序功能代码
2017/02/10 PHP
简单谈谈PHP面向对象之标识对象
2017/06/27 PHP
JavaScript 对象成员的可见性说明
2009/10/16 Javascript
js实现双向链表互联网机顶盒实战应用实现
2011/10/28 Javascript
jQuery中:disabled选择器用法实例
2015/01/04 Javascript
JavaScript实现为input与textarea自定义hover,focus效果的方法
2015/08/21 Javascript
js replace(a,b)之替换字符串中所有指定字符的方法
2016/08/17 Javascript
vue2.0+webpack环境的构造过程
2016/11/08 Javascript
vue+socket.io+express+mongodb 实现简易多房间在线群聊示例
2017/10/21 Javascript
vue动画效果实现方法示例
2019/03/18 Javascript
关于JSON解析的实现过程解析
2019/10/08 Javascript
echarts.js 动态生成多个图表 使用vue封装组件操作
2020/07/19 Javascript
python实现rest请求api示例
2014/04/22 Python
Python 关于反射和类的特殊成员方法
2017/09/14 Python
使用pytorch进行图像的顺序读取方法
2018/07/27 Python
Django在pycharm下修改默认启动端口的方法
2019/07/26 Python
Python面向对象程序设计之类和对象、实例变量、类变量用法分析
2020/03/23 Python
使用sklearn对多分类的每个类别进行指标评价操作
2020/06/11 Python
CSS3制作缩略图的详细过程
2016/07/08 HTML / CSS
HTML5 Geolocation API的正确使用方法
2018/12/04 HTML / CSS
美国销售第一的智能手机和平板电脑保护壳:OtterBox
2017/12/21 全球购物
英国床和浴室商场:Bed & Bath Emporium
2018/05/20 全球购物
Kappa英国官方在线商店:服装和运动器材
2020/11/22 全球购物
Linux文件操作命令都有哪些
2015/02/27 面试题
信息专业本科生个人的自我评价
2013/10/28 职场文书
社区春季防火方案
2014/06/02 职场文书
培养联系人考察意见
2015/06/01 职场文书
离婚财产分割协议书
2015/08/11 职场文书
基于Python实现一个春节倒计时脚本
2022/01/22 Python
Linux、ubuntu系统下查看显卡型号、显卡信息详解
2022/04/07 Servers