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
php GD绘制24小时柱状图
Jun 28 PHP
兼容PHP5的PHP目录管理函数库
Jul 10 PHP
PHP 编写大型网站问题集
May 07 PHP
PHP实现下载功能的代码
Sep 29 PHP
php 注册时输入信息验证器的实现详解
Jul 05 PHP
php calender(日历)二个版本代码示例(解决2038问题)
Dec 24 PHP
php静态文件生成类实例分析
Jan 03 PHP
php中Socket创建与监听实现方法
Jan 05 PHP
php基于GD库画五星红旗的方法
Feb 24 PHP
Yii清理缓存的方法
Jan 06 PHP
Laravel重定向,a链接跳转,控制器跳转示例
Oct 22 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
长波有什么东西
2021/03/01 无线电
PHP4 与 MySQL 数据库操作函数详解
2006/12/06 PHP
总结一些PHP中好用但又容易忽略的小知识
2017/06/02 PHP
PHP常量及变量区别原理详解
2020/08/14 PHP
在chrome中window.onload事件的一些问题
2010/03/01 Javascript
网易JS面试题与Javascript词法作用域说明
2010/11/09 Javascript
js函数定时器实现定时读取系统实时连接数
2014/04/30 Javascript
jQuery 1.9移除了$.browser可以使用$.support来替代
2014/09/03 Javascript
AngularJS中的过滤器使用详解
2015/06/16 Javascript
基于jQuery实现的向下滑动二级菜单效果代码
2015/08/31 Javascript
浅谈JavaScript中数组的增删改查
2016/06/20 Javascript
JavaScript学习笔记整理_setTimeout的应用
2016/09/19 Javascript
文件上传的几个示例分享【推荐】
2016/12/16 Javascript
Jquery Easyui自定义下拉框组件使用详解(21)
2020/12/31 Javascript
Bootstrap php制作动态分页标签
2016/12/23 Javascript
浅谈vuejs实现数据驱动视图原理
2018/02/23 Javascript
vue 右键菜单插件 简单、可扩展、样式自定义的右键菜单
2018/11/29 Javascript
深入理解JS异步编程-Promise
2019/06/03 Javascript
vue实现浏览器全屏展示功能
2019/11/27 Javascript
[02:38]2018DOTA2亚洲邀请赛赛前采访-VGJ.T
2018/04/03 DOTA
Python计算程序运行时间的方法
2014/12/13 Python
windows系统下Python环境搭建教程
2017/03/28 Python
查看Django和flask版本的方法
2018/05/14 Python
Python3自动签到 定时任务 判断节假日的实例
2018/11/13 Python
Python 脚本获取ES 存储容量的实例
2018/12/27 Python
解决pycharm工程启动卡住没反应的问题
2019/01/19 Python
python实现按日期归档文件
2021/01/30 Python
matplotlib源码解析标题实现(窗口标题,标题,子图标题不同之间的差异)
2021/02/22 Python
时装界的“朋克之母”:Vivienne Westwood
2017/07/06 全球购物
欧洲第一的摇滚和金属乐队服装网站:EMP
2017/10/26 全球购物
材料成型专业个人求职信范文
2013/09/25 职场文书
表扬信格式
2014/01/12 职场文书
年度考核自我评价
2014/01/25 职场文书
党员干部四风问题整改措施思想汇报
2014/10/12 职场文书
婚礼迎宾词大全
2015/08/10 职场文书
利用Java设置Word文本框中的文字旋转方向的实现方法
2021/06/28 Java/Android