新蒲京200.c软件下载-app官网网址 > 文章 >

当然了PHP守护进度要完成自动重启依然要信任于shell的

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

PHP写守护进程时要静心几点:

1.首先正是函数clearstatcache(State of Qatar函数这里,查官方手册能够明白该函数是破除文件状态缓存的,当在二个剧本中往往反省同三个文件的缓存状态时只要不用该函数就能够出错,受该函数影响的有:stat(State of Qatar, lstat(State of Qatar, 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了,假诺有现时间效益果的话还需退换代码。