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支持断点续传的源码
May 16 PHP
php学习之流程控制实现代码
Jun 09 PHP
linux iconv方法的使用
Oct 01 PHP
改写ThinkPHP的U方法使其路由下分页正常
Jul 02 PHP
PHP中的替代语法简介
Aug 22 PHP
thinkphp中多表查询中防止数据重复的sql语句(必看)
Sep 22 PHP
PHP中类的自动加载的方法
Mar 17 PHP
PHP使用两个栈实现队列功能的方法
Jan 15 PHP
php面试中关于面向对象的相关问题
Feb 13 PHP
laravel 解决crontab不执行的问题
Oct 22 PHP
PHP发送邮件确认验证注册功能示例【修改别人邮件类】
Nov 09 PHP
laravel框架中表单请求类型和CSRF防护实例分析
Nov 23 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调用Linux命令权限不足问题解决方法
2015/02/07 PHP
jQuery向下滚动即时加载内容实现的瀑布流效果
2016/01/07 PHP
如何利用预加载优化Laravel Model查询详解
2017/08/11 PHP
在Laravel5.6中使用Swoole的协程数据库查询
2018/06/15 PHP
PHP+MySql实现一个简单的留言板
2020/07/19 PHP
ModelDialog JavaScript模态对话框类代码
2011/04/17 Javascript
JavaScript 验证码的实例代码(附效果图)
2013/03/22 Javascript
基于JavaScript 数据类型之Boolean类型分析介绍
2013/04/19 Javascript
jQuery中:checkbox选择器用法实例
2015/01/03 Javascript
javascript正则表达式之search()用法实例
2015/01/19 Javascript
Underscore之Array_动力节点Java学院整理
2017/07/10 Javascript
jQuery模拟爆炸倒计时功能实例代码
2017/08/21 jQuery
axios 处理 302 状态码的解决方法
2018/04/10 Javascript
安装vue-cli的简易过程
2018/05/22 Javascript
vue移动端模态框(可传参)的实现
2019/11/20 Javascript
微信小程序实现可长按移动控件
2020/11/01 Javascript
python实现的防DDoS脚本
2011/02/08 Python
python分批定量读取文件内容,输出到不同文件中的方法
2018/12/08 Python
python爬虫之验证码篇3-滑动验证码识别技术
2019/04/11 Python
pandas如何处理缺失值
2019/07/31 Python
python定间隔取点(np.linspace)的实现
2019/11/27 Python
python 计算方位角实例(根据两点的坐标计算)
2020/01/17 Python
Matplotlib使用Cursor实现UI定位的示例代码
2020/03/12 Python
Python函数基本使用原理详解
2020/03/19 Python
python使用for...else跳出双层嵌套循环的方法实例
2020/05/17 Python
哪些是python中web开发框架
2020/06/17 Python
pycharm激活方法到2099年(激活流程)
2020/09/22 Python
pycharm 使用tab跳出正在编辑的括号(){}{}等问题
2021/02/26 Python
纯CSS改变webkit内核浏览器的滚动条样式
2014/04/17 HTML / CSS
Farfetch巴西官网:奢侈品牌时尚购物平台
2020/10/19 全球购物
幼师自荐信范文
2013/10/06 职场文书
招聘专员岗位职责
2014/03/07 职场文书
2014党员自我评议表范文
2014/09/20 职场文书
党员“四风”方面存在问题及整改措施
2014/09/24 职场文书
专题组织生活会思想汇报
2014/10/01 职场文书
Nginx的gzip相关介绍
2022/05/11 Servers