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 相关文章推荐
JavaScript Memoization 让函数也有记忆功能
Oct 27 Javascript
JavaScript的模块化:封装(闭包),继承(原型) 介绍
Jul 22 Javascript
jQuery实现的图片分组切换焦点图插件
Jan 06 Javascript
jQuery实现预加载图片的方法
Mar 17 Javascript
webpack学习--webpack经典7分钟入门教程
Jun 28 Javascript
JS Testing Properties 判断属性是否在对象里的方法
Oct 01 Javascript
javascript函数的节流[throttle]与防抖[debounce]
Nov 15 Javascript
微信小程序6位或多位验证码密码输入框功能的实现代码
May 29 Javascript
vue2.0获取鼠标位置的方法
Sep 13 Javascript
iview通过Dropdown(下拉菜单)实现的右键菜单
Oct 26 Javascript
详解ES6中的Map与Set集合
Mar 22 Javascript
微信小程序文章列表功能完整实例
Jun 03 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
DISCUZ 分页代码
2007/01/02 PHP
php下实现在指定目录搜索指定类型文件的函数
2008/10/03 PHP
php将mysql数据库整库导出生成sql文件的具体实现
2014/01/08 PHP
Aster vs KG BO3 第二场2.18
2021/03/10 DOTA
JS获取屏幕,浏览器窗口大小,网页高度宽度(实现代码)
2013/12/17 Javascript
js实现按Ctrl+Enter发送效果
2014/09/18 Javascript
javascript实现限制上传文件大小
2015/02/06 Javascript
Javascript动态创建div的方法
2015/02/09 Javascript
jQuery插件ajaxFileUpload异步上传文件
2016/10/19 Javascript
AngularJS constant和value区别详解
2017/02/28 Javascript
jQuery制作input提示内容(兼容IE8以上)
2017/07/05 jQuery
js 图片转base64的方式(两种)
2018/04/24 Javascript
解决select2在bootstrap modal中不能正常使用的问题
2018/08/09 Javascript
在vue项目中使用sass语法问题
2019/07/18 Javascript
[10:18]2018DOTA2国际邀请赛寻真——Fnatic能否笑到最后?
2018/08/14 DOTA
python实现在windows服务中新建进程的方法
2015/06/30 Python
python列出目录下指定文件与子目录的方法
2015/07/03 Python
python实现下载指定网址所有图片的方法
2015/08/08 Python
django基础之数据库操作方法(详解)
2017/05/24 Python
python安装教程
2018/02/28 Python
教你使用python画一朵花送女朋友
2018/03/29 Python
Python3正则匹配re.split,re.finditer及re.findall函数用法详解
2018/06/11 Python
Django中多种重定向方法使用详解
2019/07/17 Python
解决Tensorboard 不显示计算图graph的问题
2020/02/15 Python
Xadmin+rules实现多选行权限方式(级联效果)
2020/04/07 Python
使用matlab 判断两个矩阵是否相等的实例
2020/05/11 Python
Pytest单元测试框架如何实现参数化
2020/09/05 Python
一个入门级python爬虫教程详解
2021/01/27 Python
使用css3 属性如何丰富图片样式(圆角 阴影 渐变)
2012/11/22 HTML / CSS
HTML5注册表单的自动聚焦与占位文本示例代码
2013/07/19 HTML / CSS
在DELPHI中调用存储过程和使用内嵌SQL哪种方式更好
2016/11/22 面试题
安康杯竞赛活动总结
2014/05/05 职场文书
环境保护标语
2014/06/20 职场文书
写字楼租赁意向书
2014/07/30 职场文书
村委会贫困证明范文
2014/09/21 职场文书
周恩来的四个昼夜观后感
2015/06/03 职场文书