| 제목 | queue 배치 작업 | ||
|---|---|---|---|
| 글쓴이 | 닉 | 작성시각 | 2015/10/20 10:04:49 | 
|  | |||
| 안녕하세요. 선배님들 강좌를 보다가 제 시스템에 적용하려니 환경이 맞지 않더라고요. 저와 같이 몇날몇일 고생하실 분을 위해 미흡하지만 몇자 적어봤습니다. http://www.cikorea.net/lecture/view/298/page/1 <<< [상급] CodeIgniter + MQ, Parallel Processing 강좌 제환경은 mariadb + nginx + php + linux (centos7) 입니다. 강좌를 읽다보니 강좌 자체가 몽고 디비를 바탕으로 되어있더라고요. 그래서 별도로 설치하는걸 힘들어 하는 저는 mysql이나 mariadb는 안되는건가 해서 찾기 시작했습니다. 찾다보니 https://opentutorials.org/module/327/4130 <<< Queue & Cron 이란 강좌가 있더라고요. 아 충분히 가능하겠구나 라는 판단을 한 저는 약간의 두려움을 갖고 작업을 시작했습니다. config 설정입니다. (웅파님이 알려주신 소스로 잘 이용중이었는데 오류가 나서 cli모드일경우 경로를 분기하는....) //cli모드가 아니면.. if(php_sapi_name() != 'cli'){ $config['base_url'] = ((isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == "on") ? "https" : "http"); $config['base_url'] .= "://" . $_SERVER['HTTP_HOST']; $config['base_url'] .= str_replace(basename($_SERVER['SCRIPT_NAME']), "", $_SERVER['SCRIPT_NAME']); }else{ $config['base_url'] = "경로"; } cron 설정입니다. (리눅스 스케쥴러로 crontab -e로 편집합니다.) #자동업데이트 큐에 *****(작업)를 넣는다. 35 8,11,14,17,20,23 * * * su - root -c '/(경로)/php -q /(경로)/index.php 컨트롤러 queue_add(메소드) 인자' 큐로 등록할 테이블 CREATE TABLE `테이블명` ( `aq_no` int(10) unsigned NOT NULL AUTO_INCREMENT, `aq_job_name` varchar(50) NOT NULL, PRIMARY KEY (`aq_no`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 컨트롤러 입니다. 
class 컨트롤러 extends CI_Controller {
	
	public function __construct()
	{
		parent::__construct();
		$this->load->model('모델명');
	}
	
	public function index(){
		
	}
	
	public function queue_add ($job_name="") {
		if($job_name == ""){
			echo "잡이 정의되지 않음."; 
			exit;
		}
		$this->모델명->queue_add($job_name);
	}
	
	
	public function start_queue () {
		while (1) {
			$result = $this->모델명->get_queue();
			$cur_count = $result->num_rows();
			if ($cur_count > 0) {
				// 작업이 있으면 일을 시작해라.
				$this->모델명->process_queue($result);
			} else {
				// 없으면 잠시 기달림.
				sleep(rand(3, 7));
			}
		}
	}
}모델입니다. 
line = "\n";
        if(php_sapi_name() != 'cli') $this->line = "
";
    }
        
    //큐데이터 객체 리턴
    function get_queue() {
    	
    	$this->db->select("*");
    	$this->db->from("테이블명");
    	$this->db->order_by("aq_no","asc");
    	$query = $this->db->get();
    	
    	return $query;
    }
    
    //큐 실행.
    function process_queue($obj) {
    	$row = $obj->row_array();
    	
    	//큐삭제..
    	$this->db->delete('테이블명', array('aq_no' => $row['aq_no']));
    	
    	if(method_exists( $this,$row['aq_job_name'] )){
    		//예외가 발생할 수 있으니 큐 삭제 후 실행.
    		$this->$row['aq_job_name']();
    	}
    }
    
    //큐추가
    function queue_add($job_name) {
    	
    	$this->db->select("*");
    	$this->db->from("테이블명");
    	$this->db->where("aq_job_name",$job_name);
    	$this->db->order_by("aq_no","asc");
    	$query = $this->db->get();
    	//중복 등록을 막으려고 넣었어요  필요없으시면 빼도됨.
    	if( $query->num_rows() > 0 ){
	    	return false; 
    	} else {
    		$sql = array(
    				'aq_job_name'	=>	$job_name
    		);
    		$result = $this->db->insert('테이블명', $sql);
    		
    		return true;
    	}
    }
    
    function __destruct () {
    	
    }
}supervisord.conf 설정입니다. [program:mysite] command = php /경로/index.php 컨트롤러 start_queue process_name=%(program_name)s_mysite%(process_num)02d numprocs=1 // 프로세스 수 autorestart=true autostart=true 작업전엔 두려움이 컸는데 생각한 대로 실행되니 너무 기뻤습니다. 필요에 맞게 수정해서 사용하시면 될거 같습니다. | |||
| 다음글 | 서브 디렉토리 index.php 죽이기 (5) | ||
| 이전글 | [게임서버] 구글영수증 검증 (강좌마감) (5) | ||
| 
                                한대승(불의회상)
                                /
                                2015/10/20 10:57:56 /
                                추천
                                0
                             | 
좋은 강의 감사 합니다.