文字

范例

Table of Contents

用户评论:

[#1] netkiller at msn dot com [2015-10-21 09:16:21]

<?php

class Logger {
    
    public function 
__construct() {
    }

    public function 
logger($type$message) {
        
$log sprintf "%s\t%s\t%s\n"date 'Y-m-d H:i:s' ), $type$message );
        
file_put_contents sprintf(__DIR__."/../log/sender.%s.log"date 'Y-m-d' )), $logFILE_APPEND );
    }
    
}

final class 
Signal{    
    public static 
$signo 0;
    protected static 
$ini null;
    public static function 
set($signo){
        
self::$signo $signo;
    }
    public static function 
get(){
        return(
self::$signo);
    }
    public static function 
reset(){
        
self::$signo 0;
    }
}

class 
Test extends Logger {
    
//public static $signal = null;
    
    
public function __construct() {
        
//self::$signal == null;
    
}
    public function 
run(){
        while(
true){
            
pcntl_signal_dispatch();
            
printf(".");
            
sleep(1);
            if(
Signal::get() == SIGHUP){
                
Signal::reset();
                break;
            }
        }
        
printf("\n");
    }
}

class 
Daemon extends Logger {
    

    
const LISTEN "tcp://192.168.2.15:5555";
    const 
pidfile     __CLASS__;
    const 
uid        80;
    const 
gid        80;
    const 
sleep    5;

    protected 
$pool     NULL;
    protected 
$config    = array();

    public function 
__construct($uid$gid$class) {
        
$this->pidfile '/var/run/'.basename(get_class($class), '.php').'.pid';
        
//$this->config = parse_ini_file('sender.ini', true); //include_once(__DIR__."/config.php");
        
$this->uid $uid;
        
$this->gid $gid;
        
$this->class $class;
        
$this->classname get_class($class);
        
        
$this->signal();
    }
    public function 
signal(){

        
pcntl_signal(SIGHUP,  function($signo{
            
//echo "\n This signal is called. [$signo] \n";
            
printf("The process has been reload.\n");
            
Signal::set($signo);
        });

    }
    private function 
daemon(){
        if (
file_exists($this->pidfile)) {
            echo 
"The file $this->pidfile exists.\n";
            exit();
        }

        
$pid pcntl_fork();
        if (
$pid == -1) {
             die(
'could not fork');
        } else if (
$pid) {
             
// we are the parent
             //pcntl_wait($status); //Protect against Zombie children
            
exit($pid);
        } else {
            
file_put_contents($this->pidfilegetmypid());
            
posix_setuid(self::uid);
            
posix_setgid(self::gid);
            return(
getmypid());
        }
    }
    private function 
run(){

        while(
true){
            
            
printf("The process begin.\n");
            
$this->class->run();
            
printf("The process end.\n");
            
        }
    }
    private function 
foreground(){
        
$this->run();
    }
    private function 
start(){
        
$pid $this->daemon();
        for(;;){
            
$this->run();
            
sleep(self::sleep);
        }
    }
    private function 
stop(){

        if (
file_exists($this->pidfile)) {
            
$pid file_get_contents($this->pidfile);
            
posix_kill($pid9);
            
unlink($this->pidfile);
        }
    }
    private function 
reload(){
        if (
file_exists($this->pidfile)) {
            
$pid file_get_contents($this->pidfile);
            
//posix_kill(posix_getpid(), SIGHUP);
            
posix_kill($pidSIGHUP);
        }
    }    
    private function 
status(){
        if (
file_exists($this->pidfile)) {
            
$pid file_get_contents($this->pidfile);
            
system(sprintf("ps ax | grep %s | grep -v grep"$pid));
        }
    }
    private function 
help($proc){
        
printf("%s start | stop | restart | status | foreground | help \n"$proc);
    }
    public function 
main($argv){

        if(
count($argv) < 2){
            
$this->help($argv[0]);
            
printf("please input help parameter\n");
            exit();
        }
        if(
$argv[1] === 'stop'){
            
$this->stop();
        }else if(
$argv[1] === 'start'){
            
$this->start();
        }else if(
$argv[1] === 'restart'){
            
$this->stop();
            
$this->start();
        }else if(
$argv[1] === 'status'){
            
$this->status();
        }else if(
$argv[1] === 'foreground'){
            
$this->foreground();
        }else if(
$argv[1] === 'reload'){
            
$this->reload();
        }else{
            
$this->help($argv[0]);
        }
    }
}

$daemon = new Daemon(80,80, new Test());
$daemon->main($argv);
?>

上一篇: 下一篇: