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 相关文章推荐
关于jquery append() html时的小问题的解决方法
Dec 16 Javascript
初学js 新节点的创建 删除 的步骤
Jul 04 Javascript
javascript ie6兼容position:fixed实现思路
Apr 01 Javascript
Node.js事件循环(Event Loop)和线程池详解
Jan 28 Javascript
jQuery Html控件基本操作(日常收集整理)
Mar 11 Javascript
仅9张思维导图帮你轻松学习Javascript 就这么简单
Jun 01 Javascript
简单的vue-resourse获取json并应用到模板示例
Feb 10 Javascript
使用JavaScript实现表格编辑器(实例讲解)
Aug 02 Javascript
JS简单实现父子窗口传值功能示例【未使用iframe框架】
Sep 20 Javascript
基于VUE移动音乐WEBAPP跨域请求失败的解决方法
Jan 16 Javascript
浅谈在node.js进入文件目录的问题
May 13 Javascript
JS实现图片幻灯片效果代码实例
May 21 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将会员数据导入到ucenter的代码
2010/07/18 PHP
PHP中使用数组实现堆栈数据结构的代码
2012/02/05 PHP
PHP实现网页内容html标签补全和过滤的方法小结【2种方法】
2017/04/27 PHP
PHP7基于curl实现的上传图片功能
2018/05/11 PHP
PHP工厂模式的日常使用
2019/03/20 PHP
用js实现随机返回数组的一个元素
2007/08/13 Javascript
js模仿php中strtotime()与date()函数实现方法
2015/08/11 Javascript
JS实现从顶部下拉显示的带动画QQ客服特效代码
2015/10/24 Javascript
jQuery焦点图插件SaySlide
2015/12/21 Javascript
归纳下js面向对象的几种常见写法总结
2016/08/24 Javascript
获取jqGrid中选择的行的数据
2016/11/30 Javascript
原生js轮播特效
2017/05/18 Javascript
原生JS实现的双色球功能示例
2018/02/02 Javascript
angularjs实现的购物金额计算工具示例
2018/05/08 Javascript
原生JS实现轮播图效果
2018/10/12 Javascript
微信小程序实现收货地址左滑删除
2020/11/18 Javascript
微信公众号平台接口开发 获取access_token过程解析
2019/08/14 Javascript
layui表格设计以及数据初始化详解
2019/10/26 Javascript
解决vue打包 npm run build-test突然不动了的问题
2020/11/13 Javascript
[01:04:48]VGJ.S vs TNC Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
Python命名空间详解
2014/08/18 Python
Python3读取文件常用方法实例分析
2015/05/22 Python
Python3读取UTF-8文件及统计文件行数的方法
2015/05/22 Python
Python爬虫辅助利器PyQuery模块的安装使用攻略
2016/04/24 Python
Python实现简单生成验证码功能【基于random模块】
2018/02/10 Python
基于DataFrame筛选数据与loc的用法详解
2018/05/18 Python
python爬虫之自动登录与验证码识别
2020/06/15 Python
python批量修改交换机密码的示例
2020/09/22 Python
纯CSS3实现给头像加个光芒四射且旋转的背景动画效果
2014/05/07 HTML / CSS
工程监理应届生求职信
2013/11/09 职场文书
跟单文员岗位职责
2014/01/03 职场文书
初二物理教学反思
2014/01/29 职场文书
国窖1573广告词
2014/03/21 职场文书
二胎满月酒致辞
2015/07/29 职场文书
红灯733-1型14管5波段半导体收音机
2021/04/22 无线电
node快速搭建后台的实现步骤
2022/02/18 NodeJs