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随即打乱数组实现代码
Dec 03 Javascript
jQuery中addClass()方法用法实例
Jan 05 Javascript
深入理解JavaScript程序中内存泄漏
Mar 17 Javascript
js实现的万能flv网页播放器代码
Apr 30 Javascript
实例讲解JavaScript中instanceof运算符的用法
Jun 08 Javascript
js鼠标单击和双击事件冲突问题的快速解决方法
Jul 11 Javascript
获取JS中网页各种高宽与位置的方法总结
Jul 27 Javascript
angular实现IM聊天图片发送实例
May 08 Javascript
详解 vue better-scroll滚动插件排坑
Feb 08 Javascript
解决vue项目报错webpackJsonp is not defined问题
Mar 14 Javascript
详解Nuxt内导航栏的两种实现方式
Apr 16 Javascript
JavaScript 事件捕获冒泡与捕获详情
Nov 11 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 在线翻译函数代码
2009/05/07 PHP
Linux系统中设置多版本PHP共存配合Nginx服务器使用
2015/12/21 PHP
PHP对称加密函数实现数据的加密解密
2016/10/27 PHP
基于Web标准的UI组件 — 树状菜单(2)
2006/09/18 Javascript
Javascript 读后台cookie代码
2008/09/15 Javascript
33个优秀的jQuery 教程分享(幻灯片、动画菜单)
2011/07/08 Javascript
javascript操作表格排序实例分析
2015/05/06 Javascript
JS运动相关知识点小结(附弹性运动示例)
2016/01/08 Javascript
深入解析桶排序算法及Node.js上JavaScript的代码实现
2016/07/06 Javascript
微信公众号支付H5调用支付解析
2016/11/04 Javascript
性能优化之代码优化页面加载速度
2017/03/01 Javascript
jQuery 开发之EasyUI 添加数据的实例
2017/09/26 jQuery
Vue路由history模式解决404问题的几种方法
2018/09/29 Javascript
koa大型web项目中使用路由装饰器的方法示例
2019/04/02 Javascript
微信小程序纯文本实现@功能
2020/04/08 Javascript
[01:00]选手抵达华西村 整装待发备战2016国际邀请赛中国区预选赛
2016/06/25 DOTA
[03:10]超级美酒第四天 fy拉比克秀 大合集
2018/06/05 DOTA
pycharm 使用心得(七)一些实用功能介绍
2014/06/06 Python
python的文件操作方法汇总
2017/11/10 Python
Django使用HttpResponse返回图片并显示的方法
2018/05/22 Python
pygame游戏之旅 创建游戏窗口界面
2018/11/20 Python
通过实例解析python描述符原理作用
2020/01/22 Python
Django 解决新建表删除后无法重新创建等问题
2020/05/21 Python
Virtualenv 搭建 Py项目运行环境的教程详解
2020/06/22 Python
Python 实现国产SM3加密算法的示例代码
2020/09/21 Python
快速解决pymongo操作mongodb的时区问题
2020/12/05 Python
澳大利亚家用电器在线商店:Billy Guyatts
2020/05/05 全球购物
编程实现当输入某产品代码则打印出该产品记录的功能
2014/05/03 面试题
高中生自我评语大全
2014/01/19 职场文书
事假请假条范文
2014/04/11 职场文书
食堂标语大全
2014/06/11 职场文书
2014国庆节主题活动方案:快乐的国庆节
2014/09/16 职场文书
初三毕业评语
2014/12/26 职场文书
pdf论文中python画的图Type 3 fonts字体不兼容的解决方案
2021/04/24 Python
漫画「请问您今天要来点兔子吗?」最新杂志彩页公开
2022/03/24 日漫
戴尔Win11系统no bootable devices found解决教程
2022/09/23 数码科技