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 相关文章推荐
IP攻击升级,程序改进以对付新的攻击
Nov 23 PHP
PHP将DateTime对象转化为友好时间显示的实现代码
Sep 20 PHP
php 获取百度的热词数据的代码
Feb 18 PHP
基于PHP CURL获取邮箱地址的详解
Jun 03 PHP
php打开远程文件的方法和风险及解决方法
Nov 12 PHP
ThinkPHP中__initialize()和类的构造函数__construct()用法分析
Nov 29 PHP
php生成数字字母的验证码图片
Jul 14 PHP
图文介绍PHP添加Redis模块及连接
Jul 28 PHP
PHP 类与构造函数解析
Feb 06 PHP
PHP使用PDO调用mssql存储过程的方法示例
Oct 07 PHP
PHP实现限制域名访问的实现代码(本地验证)
Sep 13 PHP
Docker 安装 PHP并与Nginx的部署实例讲解
Feb 27 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
PHP中显示格式化的用户输入
2006/10/09 PHP
PHP四舍五入精确小数位及取整
2014/01/14 PHP
php使用APC实现实时上传进度条功能
2015/10/26 PHP
PHP5.5安装PHPRedis扩展及连接测试方法
2017/01/22 PHP
Laravel中为什么不使用blpop取队列详析
2018/08/01 PHP
从阿里妈妈发现的几个不错的表单验证函数
2007/09/21 Javascript
多个js与css文件的合并方法详细说明
2012/12/26 Javascript
JavaScript中json使用自己总结
2013/08/13 Javascript
js实现点击按钮后给Div图层设置随机背景颜色的方法
2015/05/06 Javascript
jQuery超精致图片轮播幻灯片特效代码分享
2015/09/10 Javascript
第十章之巨幕页头缩略图与警告框组件
2016/04/25 Javascript
xmlplus组件设计系列之列表(4)
2017/04/26 Javascript
node.js中cluster的使用教程
2017/06/09 Javascript
详解Vue.js搭建路由报错 router.map is not a function
2017/06/27 Javascript
jQuery初级教程之网站品牌列表效果
2017/08/02 jQuery
iframe与主框架跨域相互访问实现方法
2017/09/14 Javascript
echarts设置图例颜色和地图底色的方法实例
2018/08/01 Javascript
jQuery实现飞机大战小游戏
2020/07/05 jQuery
[00:56]2014DOTA2国际邀请赛 DK、iG 赛前探访
2014/07/10 DOTA
python基于pygame实现响应游戏中事件的方法(附源码)
2015/11/11 Python
Python实现快速排序算法及去重的快速排序的简单示例
2016/06/26 Python
Python解决N阶台阶走法问题的方法分析
2017/12/28 Python
python实现数据写入excel表格
2018/03/25 Python
python opencv实现运动检测
2018/07/10 Python
python实现C4.5决策树算法
2018/08/29 Python
Python 正则表达式匹配字符串中的http链接方法
2018/12/25 Python
Windows下Sqlmap环境安装教程详解
2020/08/04 Python
python的链表基础知识点
2020/09/13 Python
python+requests实现接口测试的完整步骤
2020/10/27 Python
HTML5地理定位_动力节点Java学院整理
2017/07/12 HTML / CSS
strstr()的简单实现
2013/09/26 面试题
面向对象概念面试题(.NET)
2016/11/04 面试题
2014年教研组工作总结
2014/11/26 职场文书
培养联系人考察意见
2015/06/01 职场文书
余世维讲座观后感
2015/06/11 职场文书
新教师教学工作总结
2015/08/12 职场文书