<?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");

3.电动重启也利用了crontab的日程表,将该公文添参与日程表:

crontab -e
#打开日程表,inset模式
*/3 * * * * /usr/bin/php -f process.php
#每3分钟执行一次,放置进程挂掉

那样就基本ok了,倘诺有实效的话还需改动代码。

1.第一正是函数clearstatcache(State of Qatar函数这里,查官方手册可以知晓该函数是革除文件状态缓存的,当在叁个本子中每每反省同三个文件的缓存状态时一旦不用该函数就能够出错,受该函数影响的有: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().

PHP也是足以平昔开展打点进度的起步与终止的,相对于shell来讲会轻松非常多,精通更便利,当然了PHP守护进度要贯彻自动重启照旧要凭仗于shell的crontab日程表,每间隔一段时间去实行叁遍脚本看脚本是不是须求重启,要是需要则杀掉进度删除RunFile文件,重新开动并在RunFile文件中写入pid。

PHP写守护进度时要注意几点:

2.在一而再再三再四周转该脚本时,会在运作前行行检查测验,上次进行循环的时光相差以往超过300s照旧pid号不相称都会重启该进度(时间在每一遍实施循环式都要更新touch)。

admin

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注