php进程daemon化的正确实现方法


Posted in PHP onSeptember 06, 2018

前言

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 );
 }
?>

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
php中理解print EOT分界符和echo EOT的用法区别小结
Feb 21 PHP
PHP 日志缩略名的创建函数代码
May 26 PHP
PHP通用检测函数集合
Feb 08 PHP
PHP表单验证的3个函数ISSET()、empty()、is_numeric()的使用方法
Aug 22 PHP
关于PHP session 存储方式的详细介绍
Jun 25 PHP
PHP 如何利用phpexcel导入数据库
Aug 24 PHP
php小技巧之过滤ascii控制字符
May 14 PHP
PHP获取QQ达人QQ信息的方法
Mar 05 PHP
WordPress中注册菜单与调用菜单的方法详解
Dec 18 PHP
php分页查询的简单实现代码
Mar 14 PHP
浅谈PHP匿名函数和闭包
Mar 08 PHP
Laravel框架源码解析之反射的使用详解
May 14 PHP
让Laravel API永远返回JSON格式响应的方法示例
Sep 05 #PHP
thinkPHP框架实现类似java过滤器的简单方法示例
Sep 05 #PHP
PHP使用pdo实现事务处理操作示例
Sep 05 #PHP
Django 标签筛选的实现代码(一对多、多对多)
Sep 05 #PHP
利用PHP扩展Xhprof分析项目性能实践教程
Sep 05 #PHP
PHP时间处理类操作示例
Sep 05 #PHP
PHP命名空间与自动加载类详解
Sep 04 #PHP
You might like
根德YB400的电路分析
2021/03/02 无线电
测试您的 PHP 水平的题目
2007/05/30 PHP
全世界最小的php网页木马一枚 附PHP木马的防范方法
2009/10/09 PHP
php for 循环语句使用方法详细说明
2010/05/09 PHP
PHP内核探索:哈希表碰撞攻击原理
2015/07/31 PHP
php实现的中秋博饼游戏之掷骰子并输出结果功能详解
2017/11/06 PHP
PHP FileSystem 文件系统常用api整理总结
2019/07/12 PHP
JavaScript 计算当天是本年本月的第几周
2009/03/22 Javascript
jquery tools 系列 scrollable学习
2009/09/06 Javascript
json数据与字符串的相互转化示例
2013/09/18 Javascript
jquery做的一个简单的屏幕锁定提示框
2014/03/26 Javascript
jQuery多个input求和的实现方法
2015/02/12 Javascript
JS和css实现检测移动设备方向的变化并判断横竖屏幕
2015/05/25 Javascript
jQuery基于muipicker实现仿ios时间选择
2016/02/22 Javascript
详解JS对象封装的常用方式
2016/12/30 Javascript
Vue.js实战之通过监听滚动事件实现动态锚点
2017/04/04 Javascript
详解JavaScript的BUG和错误
2018/05/07 Javascript
vue的过滤器filter实例详解
2018/09/17 Javascript
vue router导航守卫(router.beforeEach())的使用详解
2019/04/19 Javascript
layui 上传文件_批量导入数据UI的方法
2019/09/23 Javascript
浅谈vue异步数据影响页面渲染
2019/10/29 Javascript
vue自定义标签和单页面多路由的实现代码
2020/05/03 Javascript
Python实现简单http服务器
2018/04/12 Python
python3基于OpenCV实现证件照背景替换
2018/07/18 Python
关于Python 中的时间处理包datetime和arrow的方法详解
2020/03/19 Python
jupyter使用自动补全和切换默认浏览器的方法
2020/11/18 Python
python Timer 类使用介绍
2020/12/28 Python
证婚人经典证婚词
2014/01/09 职场文书
应用化学专业职业生涯规划书
2014/01/22 职场文书
《金钱的魔力》教学反思
2014/02/24 职场文书
《数星星的孩子》教学反思
2014/04/11 职场文书
公司股东合作协议书
2014/09/14 职场文书
民事诉讼代理委托书
2014/10/08 职场文书
教师群众路线心得体会
2014/11/04 职场文书
毕业欢送晚会主持词
2019/06/25 职场文书
python析构函数用法及注意事项
2021/06/22 Python