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生成html分页列表的代码
Mar 18 PHP
PHP 循环列出目录内容的函数代码
May 26 PHP
php设计模式 DAO(数据访问对象模式)
Jun 26 PHP
简单的php数据库操作类代码(增,删,改,查)
Apr 08 PHP
使用PHP编写的SVN类
Jul 18 PHP
PHP常用数组函数介绍
Jul 28 PHP
将CMYK颜色值和RGB颜色相互转换的PHP代码
Jul 28 PHP
php实现网站文件批量压缩下载功能
Oct 28 PHP
joomla数据库操作示例代码
Jan 06 PHP
PHP将身份证正反面两张照片合成一张图片的代码
Apr 08 PHP
PHP的微信支付接口使用方法讲解
Mar 08 PHP
php+layui数据表格实现数据分页渲染代码
Oct 26 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读取csv实现csv文件下载功能
2013/12/18 PHP
PHP之APC缓存详细介绍 apc模块安装
2014/01/13 PHP
php的sprintf函数的用法 控制浮点数格式
2014/02/14 PHP
PHP编写RESTful接口的方法
2016/02/21 PHP
PHP+MySQL实现的简单投票系统实例
2016/02/24 PHP
php爬取天猫和淘宝商品数据
2018/02/23 PHP
gearman管理工具GearmanManager的安装与php使用方法示例
2020/02/27 PHP
js操作select控件的几种方法
2010/06/02 Javascript
JavaScript之appendChild、insertBefore和insertAfter使用说明
2010/12/30 Javascript
基于jquery实现一张图片点击鼠标放大再点缩小
2013/09/29 Javascript
ExtJs中gridpanel分组后组名排序实例代码
2013/12/02 Javascript
jquery实现checkbox 全选/全不选的通用写法
2014/02/22 Javascript
2种jQuery 实现刮刮卡效果
2015/02/01 Javascript
JavaScript给url网址进行encode编码的方法
2015/03/18 Javascript
jQuery下拉菜单的实现代码
2016/11/03 Javascript
Bootstrap CSS使用方法
2016/12/23 Javascript
微信小程序之MaterialDesign--input组件详解
2017/02/15 Javascript
Bootstrap Table使用整理(二)
2017/06/09 Javascript
mui框架移动开发初体验详解
2017/10/11 Javascript
vue自定义指令directive实例详解
2018/01/17 Javascript
vue中使用ueditor富文本编辑器
2018/02/08 Javascript
layui table 参数设置方法
2018/08/14 Javascript
jQuery实现简单的Ajax调用功能示例
2019/02/15 jQuery
javascript数组常见操作方法实例总结【连接、添加、删除、去重、排序等】
2019/06/13 Javascript
Python中的zipfile模块使用详解
2015/06/25 Python
Python使用MD5加密算法对字符串进行加密操作示例
2018/03/30 Python
flask实现验证码并验证功能
2019/12/05 Python
python字符串的index和find的区别详解
2020/06/20 Python
matplotlib之pyplot模块坐标轴标签设置使用(xlabel()、ylabel())
2021/02/22 Python
哥伦比亚最大的网上商店:Linio哥伦比亚
2016/09/25 全球购物
Interrail法国:乘火车探索欧洲,最受欢迎的欧洲铁路通票
2019/08/27 全球购物
SK-II神仙水美国官网:SK-II美国
2020/02/25 全球购物
高中课程设置方案
2014/05/28 职场文书
党的群众路线教育实践活动方案
2014/10/31 职场文书
学习雷锋主题班会
2015/08/14 职场文书
2016年重阳节慰问信
2015/12/01 职场文书