| 제목 | 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
|
좋은 강의 감사 합니다.