鸿 网 互 联 www.68idc.cn

当前位置 : 主页 > 网站制作教程 > php > >

daemon例子

来源:互联网 作者:佚名 时间:2016-07-17 11:10
无详细内容 无 ?php declare(ticks = 1); //类似一个计时器,在这里配合SIGALRM使用,产生时间。 $init_mds = md5_file('config.php'); //注册信号处理函数 pcntl_signal( SIGALRM, "signal_handler", true); pcntl_signal( SIGHUP, "signal_handler", TRUE);
<无详细内容> <无>
<?php
    declare(ticks = 1);  //类似一个计时器,在这里配合SIGALRM使用,产生时间。
    $init_mds = md5_file('config.php');
    //注册信号处理函数
    pcntl_signal( SIGALRM, "signal_handler", true);
    pcntl_signal( SIGHUP, "signal_handler", TRUE);

    $job_flag = FALSE;
    $signal_flag = FALSE;

    while(1){
        $job_flag = FALSE;
        print "worker start running... \n";
        sleep(5);
        print "worker's task done... \n";
        $flag = TRUE;
//创建子进程,同事退出当前进程
        AutoStart( $signal_flag );
    }

    function signal_handler( $signal ){
        global $job_flag;  //声明全局 一下使用该变量值
        global $signal_flag;

        switch( $signal ){
            case SIGQUIT:
                print date('y-m-d H:i:s', time() ). "Caugth signal: SIGQUIT - No : $signal \n";
                exit(0);
                break;
            case SIGSTOP:
                print date('y-m-d H:i:s', time() ). "Caugth signal: SIGSTOP - No : $signal \n";
                exit(0);      
                break;
            case SIGHUP:
                print date('y-m-d H:i:s', time() ). "Caugth signal: SIGHUP - No : $signal \n";
                if( $flag == TRUE){
                    AutoSatrt(TRUE);
                }else{
                    $signal_flag = TRUE;
                } 
                break;
            case SIGALRM: 
                print date('y-m-d H:i:s', time() ). "Caugth signal: SIGHUP - No : $signal \n";
                pcntl_alarm( 5 );
                break;
            default:
                break;
        }
    }


    function AutoStart($signal = FALSE, $filename = 'config.php'){
        global $init_md5;
        //文件被改变情况下fork子进程,父进程退出,子进程重新做MD5散列
        if($signal || md5_file($filename) != $init_md5){
            //创建进程
            $pid = pcntl_fork();
            if($pid == -1){
                print "Fork error \n";
            }else if( $pid > 0){
                print "Parent exit \n";
                exit(0);
            }else{
                $init_md5 = md5_file($filename);
                print "Child continue to run \n";
            }
        }
    }
?>
网友评论