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 去字符串空格终极版(支持utf8)
Nov 14 Javascript
js识别不同浏览器基于userAgent做判断
Jul 29 Javascript
jquery 实现输入邮箱时自动补全下拉提示功能
Oct 04 Javascript
原生js实现焦点轮播图效果
Jan 12 Javascript
JS设计模式之数据访问对象模式的实例讲解
Sep 30 Javascript
微信小程序数字滚动插件使用详解
Feb 02 Javascript
详解Puppeteer 入门教程
May 09 Javascript
使用js实现将后台传入的json数据放在前台显示
Aug 06 Javascript
JS实现的对象去重功能示例
Jun 04 Javascript
JS阻止事件冒泡的方法详解
Aug 26 Javascript
通过layer实现可输入的模态框的例子
Sep 27 Javascript
vue.js的状态管理vuex中store的使用详解
Nov 08 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
附件名前加网站名
2008/03/23 PHP
基于PHP array数组的教程详解
2013/06/05 PHP
php使用curl打开https网站的方法
2015/06/17 PHP
Yii rules常用规则示例
2016/03/15 PHP
Laravel Validator 实现两个或多个字段联合索引唯一
2019/05/08 PHP
php项目中类的自动加载实例讲解
2019/09/12 PHP
accesskey 提交
2006/06/26 Javascript
jquery tab插件制作实现代码
2010/06/22 Javascript
js querySelector和getElementById通过id获取元素的区别
2012/04/20 Javascript
js控制的回到页面顶端goTop的代码实现
2013/03/20 Javascript
实例说明为什么不要行内使用javascript
2014/04/18 Javascript
Javascript基础知识(二)事件
2014/09/29 Javascript
JavaScript中的对象序列化介绍
2014/12/30 Javascript
js控制页面的全屏展示和退出全屏显示的方法
2015/03/10 Javascript
jQuery滚动条插件nanoscroller使用指南
2015/04/21 Javascript
js实现select选择框效果及美化
2016/08/19 Javascript
Javascript6中字符串的四个新用法分享
2016/09/11 Javascript
浅谈移动端之js touch事件 手势滑动事件
2016/11/07 Javascript
Jquery中attr与prop的区别详解
2017/05/27 jQuery
node通过express搭建自己的服务器
2017/09/30 Javascript
Node.js中,在cmd界面,进入退出Node.js运行环境的方法
2018/05/12 Javascript
使用Node.js在深度学习中做图片预处理的方法
2019/09/18 Javascript
JS字符串和数组如何实现相互转化
2020/07/02 Javascript
用python写个自动SSH登录远程服务器的小工具(实例)
2017/06/17 Python
python学生管理系统学习笔记
2019/03/19 Python
Python集中化管理平台Ansible介绍与YAML简介
2019/06/12 Python
Python 中pandas索引切片读取数据缺失数据处理问题
2019/10/09 Python
Python基于Faker假数据构造库
2020/11/30 Python
定义css设备类型-Media Queries图表简介及使用方法
2013/01/21 HTML / CSS
记一次高分屏下canvas模糊问题
2020/02/17 HTML / CSS
大学生优秀团员事迹材料
2014/01/30 职场文书
乔迁之喜主持词
2014/03/27 职场文书
2015年控辍保学工作总结
2015/05/18 职场文书
陪护人员误工证明
2015/06/24 职场文书
2015年卫生局工作总结
2015/07/24 职场文书
MySQL 不等于的三种使用及区别
2021/06/03 MySQL