龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > php编程 >

daemon例子

时间:2014-07-22 14:48来源: 作者: 点击:
分享到:
<无详细内容>
<?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";
            }
        }
    }
?>
精彩图集

赞助商链接