PHP守护进程实例


Posted in Javascript onMarch 06, 2015

php也是可以直接进行守护进程的启动与终止的,相对于shell来说会简单很多,理解更方便,当然了php的守护进程要实现自动重启还是要依赖于shell的crontab日程表,每隔一段时间去执行一次脚本看脚本是否需要重启,如果需要则杀掉进程删除RunFile文件,重新启动并在RunFile文件中写入pid。

<?php       

function start($file){

    $path = dirname(__FILE__).'/';

    $runfile = $path.$file.'.run';

    $diefile = $path.$file.'.die';

    $file = $path."data/{$file}.php";

    clearstatcache();

    if(file_exists($runfile)){

        $oldpid = file_get_contents($runfile);

        $nowpid = shell_exec("ps aux | grep 'php -f process.php' | grep ${oldpid} | awk '{print $2}'");

        //如果runfile中的pid号可以匹配到正在运行的,并且上次访问runfile的时间和现在相差小于5min则返回

        if(($oldpid == $nowpid) && (time() - fileatime($runfile) < 300)){

            echo "$file is circle runing no";

            return;

        }else{

            //pid号不匹配或者已经有300秒没有运行循环语句,直接杀掉进程,重新启动

            $pid = file_get_contents($runfile);

            shell_exec("ps aux | grep 'php -f process.php' | grep {$pid} | xargs --if-no-run-empty kill");

        }

    }else{

        //将文件pid写入run文件

        if(!($newpid = getmypid()) || !file_put_contents($runfile,$newpid)){

            return;

        }

        while(true){

            //收到结束进程新号,结束进程,并删除相关文件

            if(file_exists($diefile) && unlink($runfile) && unlink($diefile)){

                return;

            }

            /*这里是守护进程要做的事*/

            file_put_contents($file,"I'm Runing Now".PHP_EOL,FILE_APPEND);

            /***********************/

            touch($runfile);

            sleep(5);

        }

    }

}

start("test");

hp写守护进程时童谣要注意几点:

1.首先就是函数clearstatcache()函数那里,查官方手册可以知道该函数是清除文件状态缓存的,当在一个脚本中多次检查同一个文件的缓存状态时如果不用该函数就会出错,受该函数影响的有:stat(), lstat(), file_exists(), is_writable(),is_readable(), is_executable(), is_file(), is_dir(), is_link(),filectime(), fileatime(), filemtime(), fileinode(), filegroup(),fileowner(), filesize(), filetype(), fileperms().
2.在多次运行该脚本时,会在运行前进行检测,上次执行循环的时间距离现在大于300s或者pid号不匹配都会重启该进程(时间在每次执行循环式都要更新touch)。
3.自动重启也用到了crontab的日程表,将该文件添加入日程表:

crontab -e

#打开日程表,inset模式
*/3 * * * * /usr/bin/php -f process.php

#每3分钟执行一次,放置进程挂掉

这样就基本ok了,要是有具体功能的话还需改动代码。

Javascript 相关文章推荐
js限制文本框只能输入数字(正则表达式)
Jul 15 Javascript
Js中setTimeout()和setInterval() 何时被调用执行的用法
Apr 12 Javascript
JavaScript获取指定元素位置的方法
Apr 08 Javascript
Bootstrap table使用方法总结
May 10 Javascript
jQuery层级选择器_动力节点节点Java学院整理
Jul 04 jQuery
移动端触摸滑动插件swiper使用方法详解
Aug 11 Javascript
JavaSctit 利用FileReader和滤镜上传图片预览功能
Sep 05 Javascript
浅谈react-native热更新react-native-pushy集成遇到的问题
Sep 30 Javascript
详解Chai.js断言库API中文文档
Jan 31 Javascript
微信小程序自定义navigationBar顶部导航栏适配所有机型(附完整案例)
Apr 26 Javascript
JS实现简单移动端鼠标拖拽
Jul 23 Javascript
小程序自定义圆形进度条
Nov 17 Javascript
JavaScript操作Oracle数据库示例
Mar 06 #Javascript
jQuery解析XML与传统JavaScript方法的差别实例分析
Mar 05 #Javascript
jquery实现翻动fadeIn显示的方法
Mar 05 #Javascript
Shell脚本实现Linux系统和进程资源监控
Mar 05 #Javascript
TinyMCE提交AjaxForm获取不到数据的解决方法
Mar 05 #Javascript
jQuery实现数秒后自动提交form的方法
Mar 05 #Javascript
Redis基本知识、安装、部署、配置笔记
Mar 05 #Javascript
You might like
php实现每天自动变换随机问候语的方法
2015/05/12 PHP
jquery实现的元素的left增加N像素 鼠标移开会慢慢的移动到原来的位置
2010/03/21 Javascript
预加载css或javascript的js代码
2010/04/23 Javascript
jQuery UI Datepicker length为空或不是对象错误的解决方法
2010/12/19 Javascript
导航跟随滚动条置顶移动示例代码
2013/09/11 Javascript
JavaScript避免代码的重复执行经验技巧分享
2014/04/17 Javascript
详谈jQuery中的this和$(this)
2014/11/13 Javascript
jquery移动节点实例
2015/01/14 Javascript
简介JavaScript中的push()方法的使用
2015/06/09 Javascript
jquery 判断selection range 是否在容器中的简单实例
2016/08/02 Javascript
聊一聊Vue.js过渡效果
2016/09/07 Javascript
jQuery ready()和onload的加载耗时分析
2016/09/08 Javascript
jQuery插件ajaxFileUpload使用实例解析
2016/10/19 Javascript
Node.js连接postgreSQL并进行数据操作
2016/12/18 Javascript
jQuery常见面试题之DOM操作详析
2017/07/05 jQuery
JavaScript实现快速排序的方法分析
2018/01/10 Javascript
mpvue实现左侧导航与右侧内容的联动
2019/10/21 Javascript
js prototype深入理解及应用实例分析
2019/11/25 Javascript
Vue+Node实现的商城用户管理功能示例
2019/12/23 Javascript
jquery html添加元素/删除元素操作实例详解
2020/05/20 jQuery
Vue router安装及使用方法解析
2020/12/02 Vue.js
[01:02]DOTA2上海特锦赛SHOWOPEN
2016/03/25 DOTA
使用Python对MySQL数据操作
2017/04/06 Python
python打包压缩、读取指定目录下的指定类型文件
2018/04/12 Python
解决使用pycharm提交代码时冲突之后文件丢失找回的方法
2018/08/05 Python
Python socket连接中的粘包、精确传输问题实例分析
2020/03/24 Python
python随机模块random的22种函数(小结)
2020/05/15 Python
HTML5 Canvas自定义圆角矩形与虚线示例代码
2013/08/02 HTML / CSS
H5混合开发app如何升级的方法
2018/01/10 HTML / CSS
英文简历中的自荐信范文
2013/12/14 职场文书
商务英语专业求职信范文
2014/01/28 职场文书
销售岗位职责范本
2014/06/12 职场文书
法学专业大学生实习自我鉴定
2014/10/05 职场文书
写给孩子的新学期寄语
2015/02/27 职场文书
2016大学优秀学生干部事迹材料
2016/03/01 职场文书
python 命令行传参方法总结
2021/05/25 Python