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 相关文章推荐
让你成为更出色的PHP开发者的10个技巧
Feb 25 PHP
php 求质素(素数) 的实现代码
Apr 12 PHP
php查询mssql出现乱码的解决方法
Dec 29 PHP
php程序内部post数据的方法
Mar 31 PHP
php实现通过cookie换肤的方法
Jul 13 PHP
thinkphp框架实现数据添加和显示功能
Jun 29 PHP
你不知道的文件上传漏洞php代码分析
Sep 29 PHP
php each 返回数组中当前的键值对并将数组指针向前移动一步实例
Nov 22 PHP
PHP实现ASCII码与字符串相互转换的方法
Apr 29 PHP
让whoops帮我们告别ThinkPHP6的异常页面
Mar 02 PHP
Thinkphp 框架扩展之标签库驱动原理与用法分析
Apr 23 PHP
php实现的证件照换底色功能示例【人像抠图/换背景图】
May 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
萌王史莱姆”萌王性别尴尬!那“萌战”归女组还是男?
2018/12/17 日漫
phpinfo 系统查看参数函数代码
2009/06/05 PHP
php实现的一个很好用HTML解析器类可用于采集数据
2013/09/23 PHP
php通过ajax实现双击table修改内容
2014/04/28 PHP
ThinkPHP和UCenter接口冲突的解决方法
2016/07/25 PHP
javascript  Error 对象 错误处理
2008/05/18 Javascript
MooTools 页面滚动浮动层智能定位实现代码
2011/08/23 Javascript
jquery实现ajax提交form表单的方法总结
2014/03/03 Javascript
setTimeout()递归调用不加引号出错的解决方法
2014/09/05 Javascript
详解Wondows下Node.js使用MongoDB的环境配置
2016/03/01 Javascript
JS获取地址栏参数的两种方法(简单实用)
2016/06/14 Javascript
js 定义对象数组(结合)多维数组方法
2016/07/27 Javascript
jQuery实现两列等高并自适应高度
2016/12/22 Javascript
JS实现的简单图片切换功能示例【测试可用】
2017/02/14 Javascript
node.JS md5加密中文与php结果不一致的解决方法
2017/05/05 Javascript
基于jQuery实现手风琴菜单、层级菜单、置顶菜单、无缝滚动效果
2017/07/20 jQuery
Angular中ng-repeat与ul li的多层嵌套重复问题
2017/07/24 Javascript
详解ES6 Fetch API HTTP请求实用指南
2018/11/14 Javascript
webpack配置proxyTable时pathRewrite无效的解决方法
2018/12/13 Javascript
JavaScript实现无限级递归树的示例代码
2019/03/29 Javascript
Vue实现仿iPhone悬浮球的示例代码
2020/03/13 Javascript
[01:06:59]完美世界DOTA2联赛PWL S2 Magma vs FTD 第一场 11.29
2020/12/02 DOTA
python计算方程式根的方法
2015/05/07 Python
python通过Windows下远程控制Linux系统
2018/06/20 Python
python实现一个简单的udp通信的示例代码
2019/02/01 Python
浅谈Pycharm的项目文件名是红色的原因及解决方式
2020/06/01 Python
Python的轻量级ORM框架peewee使用教程
2021/02/05 Python
日本一家专门经营各种箱包的大型网站:Traveler Store
2016/08/03 全球购物
英国领先的葡萄酒专家:Majestic Wine
2017/05/30 全球购物
OSPF有什么优点?为什么OSPF比RIP收敛快?
2013/02/13 面试题
万能检讨书2000字
2014/10/17 职场文书
开展党的群众路线教育实践活动情况汇报
2014/11/05 职场文书
安全先进个人材料
2014/12/29 职场文书
介绍信的格式
2015/01/30 职场文书
OpenCV-Python实现图像平滑处理操作
2021/06/08 Python
Unicode中的CJK(中日韩统一表意文字)字符小结
2021/12/06 HTML / CSS