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模拟HTTP认证
Oct 09 PHP
PHP has encountered an Access Violation
Jan 15 PHP
mcrypt启用 加密以及解密过程详细解析
Aug 07 PHP
php curl_init函数用法
Jan 31 PHP
PHP遍历文件夹与文件类及处理类用法实例
Sep 23 PHP
php单文件版在线代码编辑器
Mar 12 PHP
PHP经典算法集锦【经典收藏】
Sep 14 PHP
PHP中的使用curl发送请求(GET请求和POST请求)
Feb 08 PHP
Discuz不使用插件实现简单的打赏功能
Mar 21 PHP
Laravel框架实现多数据库连接操作详解
Jul 12 PHP
laravel Validator ajax返回错误信息的方法
Sep 29 PHP
PHP获取当前时间不准确问题解决方案
Aug 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
phplot生成图片类用法详解
2015/01/06 PHP
WordPress中制作导航菜单的PHP核心方法讲解
2015/12/11 PHP
PHP微信API接口类
2016/08/22 PHP
PHP环形链表实现方法示例
2017/09/15 PHP
JavaScript replace(rgExp,fn)正则替换的用法
2010/03/04 Javascript
javascript判断机器是否联网的2种方法
2013/08/09 Javascript
JS基于VML技术实现的五角星礼花效果代码
2015/10/26 Javascript
Bootstrap媒体对象的实现
2016/05/01 Javascript
只需五句话搞定JavaScript作用域(经典)
2016/07/26 Javascript
AngularJS实现的输入框字数限制提醒功能示例
2017/10/26 Javascript
如何从零开始手写Koa2框架
2019/03/22 Javascript
jquery+css实现Tab栏切换的代码实例
2019/05/14 jQuery
判断js数据类型的函数实例详解
2019/05/23 Javascript
使用 node.js 模仿 Apache 小部分功能
2019/07/07 Javascript
微信小程序indexOf的替换方法(推荐)
2020/01/14 Javascript
详解用js代码触发dom事件的实现方案
2020/06/10 Javascript
Vue elementui字体图标显示问题解决方案
2020/08/18 Javascript
python开发之for循环操作实例详解
2015/11/12 Python
PyCharm在win10的64位系统安装实例
2017/11/26 Python
Python的UTC时间转换讲解
2019/02/26 Python
python抓取需要扫微信登陆页面
2019/04/29 Python
python 含子图的gif生成时内存溢出的方法
2019/07/07 Python
python实现从本地摄像头和网络摄像头截取图片功能
2019/07/11 Python
使用pyinstaller逆向.pyc文件
2019/12/20 Python
Python实现Keras搭建神经网络训练分类模型教程
2020/06/12 Python
如何设置PyCharm中的Python代码模版(推荐)
2020/11/20 Python
ReVive利维肤美国官网:RéVive Skincare
2018/04/18 全球购物
PHP面试题集
2016/12/18 面试题
Linux文件系统类型
2012/09/16 面试题
银行会计财务工作个人的自我评价
2013/10/29 职场文书
竞争性谈判邀请书
2014/02/06 职场文书
正科级干部考察材料
2014/05/29 职场文书
个人作风建设剖析材料
2014/10/11 职场文书
答辩状格式范本
2015/05/22 职场文书
宝宝满月祝酒词
2015/08/10 职场文书
2019各种保证书范文
2019/06/24 职场文书