基于Gearman的PHP封装类

来源:互联网 发布:ubuntu gtx1080 驱动 编辑:程序博客网 时间:2024/04/30 14:38

在多个jobs server时,PHP的gearman扩展在jobs server端口不通的情况下会自动检测出来,从而自动切换到另一个;但是在IP不通的情况下,就会出错了。

该封装解决了几个问题:

1、Jobs Server的IP如果突然不可达(例如机器关机),worker会自动重新添加jobs server(默认会报错然后worker终止);

2、添加jobs server时候只添加有效的server(如果把IP不通的server添加进去,后面会报错);

PS:最下面那个函数就是我用来检测有效jobs server的,粗暴的方法:P


/**
 * worker 类
 */ 
classGW{ 
    private$enabled = False; 
    private$worker = null; 
    private$config = array();    
    private$task = array();//注册的任务信息 
   
    /**
     * 创建worker对象,添加job服务器
     * @param  array    $config     job server config
     * @return void
     */ 
    publicfunction __construct($config
    
        $this->config =$config
        $this->initWorker(); 
    
   
    /**
     * 注册任务及处理函数
     * @param   string  $task_name  要注册的"任务"
     * @param   string  $fun_name   对应的处理函数的函数名
     * @return  boolean
     */ 
    publicfunction regTask($task_name,$fun_name){ 
        if(!$this->enabled){ 
            $ret= false; 
        }else
            //Register and add callback function 
            $ret= $this->worker->addFunction($task_name,$fun_name); 
            if($ret){ 
                $this->task[$task_name] = $fun_name;     
            
        
        return$ret
    
   
    /**
     * 运行worker
     * @return  void/boolean
     */ 
    publicfunction run(){ 
        if(!$this->enabled){ 
            returnFalse; 
        
        while(@$this->worker->work() || $this->worker->returnCode()!=GEARMAN_SUCCESS) 
        {            
            // 运行中出错 
            //echo "error: " . $this->worker->error() . "\n"; 
            //echo "return_code: " . $this->worker->returnCode() . "\n"; 
   
            // 自动重启worker,并重新注册之前的task 
            if($this->worker->returnCode()!=GEARMAN_SUCCESS) 
            
                $this->enabled = False; 
                $this->initWorker(); 
                $ret= $this->reloadTask(); 
                if($ret){ 
                    // 重启成功 
                    $this->run(); 
                }else
                    // 重启失败 
                
            }        
        
    
   
    /**
     * 添加有效的jobs server到worker中
     */ 
    privatefunction initWorker() 
    {        
        $this->worker =new GearmanWorker(); 
        //add job server 
        foreach($this->configas $value) {           
            $host= trim(strval($value['host'])); 
            $port= array_key_exists('port',$value) ? intval($value['port']) : 4730; 
            if(!check_conn($host,$port)){ 
                continue
            }else
                $this->worker->addServer($host,$port); 
                $this->enabled = True; 
            
        
   
    
   
    /**
     * 重新注册之前的任务
     */ 
    privatefunction reloadTask(){ 
        $ret= False; 
        foreach($this->taskas $task_name=> $fun_name){ 
            $ret= $this->regTask($task_name,$fun_name);     
        
        return$ret
    
   
    /**
     * 是否已添加有效jobs server
     */ 
    publicfunction isEnabled(){ 
        return$this->enabled;     
    
}    
   
   
/**
 * client 类
 */ 
classGC{ 
    private$enabled = false; 
    private$client = null; 
   
    /**
     * 创建client对象,添加job服务器
     * @param  array    $config     job server config
     * @param  int      $timeout    超时时间(毫秒)
     * @return void
     */ 
    publicfunction __construct($config,$timeout=5000) 
    
        $this->client =new GearmanClient(); 
   
        //add job server 
        foreach($config as $value) {  
            $host= trim(strval($value['host'])); 
            $port= array_key_exists('port',$value) ? intval($value['port']) : 4730; 
            if(!check_conn($host,$port)){ 
                continue
            }else
                $this->client->addServer($host,$port); 
                $this->enabled = True; 
            
        
        $this->enabled &&$this->client->setTimeout($timeout); 
    
    /**
     * 发送消息,并等待响应
     * @param   string      任务名
     * @param   string      该任务的数据
     * @return  mixed       job server返回的结果
     */ 
    publicfunction send($task_name,$task_data
    
        if(!$this->enabled){ 
            $ret= false;    
        }else
            $ret= $this->client->do($task_name,strval($task_data)); 
        
        return$ret
    
   
    /**
     * 是否已添加有效jobs server
     */ 
    publicfunction isEnabled(){ 
        return$this->enabled;     
    
   
   
/**
 * 网络检测
 * @param   string  机器IP
 * @param   string  机器port
 * @return  bool           
 */ 
functioncheck_conn($ip,$port = 4730) 
    // socket链接测试,200ms超时 
    @$fp= fsockopen($ip,$port, $errno,$errstr, 0.2);  
    if($fp){        
        $fp&& fclose($fp); 
        returntrue;    
    }else
        returnfalse;    
    
}

0 0
原创粉丝点击