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 相关文章推荐
一个可查询所有表的“通用”查询分页类
Oct 09 PHP
jQuery EasyUI API 中文文档 - DateBox日期框
Oct 15 PHP
php中serialize序列化与json性能测试的示例分析
Apr 27 PHP
php 模拟POST提交的2种方法详解
Jun 17 PHP
深入extjs与php参数交互的详解
Jun 25 PHP
php 判断是否是中文/英文/数字示例代码
Sep 30 PHP
phpQuery让php处理html代码像jQuery一样方便
Jan 06 PHP
php简单实现快速排序的方法
Apr 04 PHP
php将日期格式转换成xx天前的格式
Apr 16 PHP
如何使用纯PHP实现定时器任务(Timer)
Jul 31 PHP
ThinkPHP静态缓存简单配置和使用方法详解
Mar 23 PHP
php ajax实现文件上传进度条
Mar 29 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
PHP5.2下chunk_split()函数整数溢出漏洞 分析
2007/06/06 PHP
php inc文件使用的风险和注意事项
2013/11/12 PHP
php递归实现无限分类的方法
2015/07/28 PHP
PHP手机短信验证码实现流程详解
2018/05/17 PHP
phpcmsv9.0任意文件上传漏洞解析
2020/10/20 PHP
Jquery实现仿新浪微博获取文本框能输入的字数代码
2013/02/22 Javascript
多个表单中如何获得这个文件上传的网址实现js代码
2013/03/25 Javascript
js获取class的所有元素
2013/03/28 Javascript
javascript监听鼠标滚轮事件浅析
2014/06/05 Javascript
node.js中的fs.symlink方法使用说明
2014/12/15 Javascript
js实现在网页上简单显示时间的方法
2015/03/02 Javascript
JS轮播图中缓动函数的封装
2020/11/25 Javascript
bootstrap datetimepicker 日期插件在火狐下出现一条报错信息的原因分析及解决办法
2017/03/08 Javascript
基于React实现表单数据的添加和删除详解
2017/03/14 Javascript
angular.js + require.js构建模块化单页面应用的方法步骤
2017/07/19 Javascript
JavaScript实现各种排序的代码详解
2017/08/28 Javascript
关于axios如何全局注册浅析
2018/01/14 Javascript
浅谈Angularjs中不同类型的双向数据绑定
2018/07/16 Javascript
react native基于FlatList下拉刷新上拉加载实现代码示例
2018/09/30 Javascript
解决vue单页面多个组件嵌套监听浏览器窗口变化问题
2020/07/30 Javascript
python 参数列表中的self 显式不等于冗余
2008/12/01 Python
Python决策树和随机森林算法实例详解
2018/01/30 Python
PyQt5每天必学之像素图控件QPixmap
2018/04/19 Python
Python远程方法调用实现过程解析
2020/07/28 Python
HTML5 Canvas 旋转风车绘制
2017/08/18 HTML / CSS
欧洲当代手工玻璃和瓷器的领先品牌:LSA International
2018/06/03 全球购物
介绍下Lucene建立索引的过程
2016/03/02 面试题
英语文学专业学生的自我评价
2013/10/31 职场文书
5s标语大全
2014/06/23 职场文书
2014大学生职业生涯规划书最新范文
2014/09/13 职场文书
向国旗敬礼活动小结
2014/09/27 职场文书
公司离职证明范本
2014/10/17 职场文书
运动员加油词
2015/07/18 职场文书
Java Socket实现Redis客户端的详细说明
2021/05/26 Redis
go语言中http超时引发的事故解决
2021/06/02 Golang
GPU服务器的多用户配置方法
2022/07/07 Servers