CI 묻고 답하기

제목 특정 메뉴로 들어가면 무한 로딩 현상이발생하네요 ㅜㅜ
카테고리 CI 2, 3
글쓴이 정수리 작성시각 2016/09/13 11:24:17
댓글 : 27 추천 : 0 스크랩 : 0 조회수 : 18913   RSS

8개월차 신입니다 ㅜㅜ

 

회사프로젝트를 진행중인데 혼자 코딩을 하고있습니다 ㅜㅜ

 

ci로 프로젝트를 만들고 있는데  특정 메뉴로 들어가서 일정시간동안 버튼을 클릭하고 기능을 시험해보면

 

무한로딩이 걸리네요 ㅜㅜ 파폭만 그러는줄 알았는데 다른 브라우저들로 들어가서 확인 해보니 

 

잘되다가 시간이 좀지나면 무한로딩이 걸려버리네요 ㅜㅜ

 

파이어버그로 확인할려고해도 무한로딩이 걸려버리니 아무것도 안뜨고 참 난감하네요 물어볼 사수분도 없으셔서 

 

혼자 해결해야 하는데 ㅜㅜ  이런 경우는 어디서 부터 확인을 해야할지도 모르겠고 그래서 포럼에 글을 올리게 되었습니다.

 

특정 메뉴의 경우 일정관리라는 메뉴인데 DB의 경우 외부서버에 있는 DB와 연결되어 데이터를 등록,수정,삭제를 하고 있습니다.

 

어떤부분에서 어떤현상이 일어난다고 구체적으로 말씀드리고 싶지만 ㅜㅜ 무한로딩때문에 아무것도 안떠서 알려드릴수 있는 정보는

제가 작성한 코드밖에 없네요 ㅜㅜ 

$pg_pk = $this->uri->segment(5,0);
$gginfo['gg_no'] =기관 넘버
$gginfo['gg_name'] =기관이름
$chkurl=base_url().'index.php/gigwan_c/check_info/'.$gginfo['gg_no'].'/'.$gginfo['gg_name'];

$pg_pk = 프로그램 기본키값
<li><a href="<?= $chkurl?>/<?= $pg_pk ?>">점검&일정관리</a></li>

점검&일정관리 클릭시
function check_info(){//처음 진입시 일정관리 관련 데이터를 리스트로 출력
 $no =  $this->uri->segment(3);//기관pk
				
  $gg_name = $this->uri->segment(4);//기관명
  $this->load->model('Check_m'); 	
 $date['list'] = $this->Check_m->ck_list($no);
 $date['gginfo'] = array('gg_no' =>$no, 'gg_name' =>$gg_name);
  $this->load->view('gigwan/gg_check_v', $date);
}
--컨트롤러--
function ck_regit(){//일정관리 등록
			
			$this->load->model('Check_m');
			
			$data = array();
			foreach($this->input->post(null, true) as $key => $val) $data["{$key}"]= $val;

			$result = $this->Check_m->ck_regit($data);

			if($result){
				echo "
					<meta http-equiv='Content-type' content='text/html; charset=utf-8'>
					<script>alert('등록되었습니다');
					window.opener.parent.location.reload();
						window.close();
					</script>";
			}
		}

function ck_detail(){//1개의 일정관리 클릭 시 ajax통신을 통해 클릭한 일정관리 밑으로 데이터 출력
			
			$this->load->model('Check_m');

			$ck_pk = $this->input->post('ck_pk', true);

			$result  = $this->Check_m->ck_detail($ck_pk);

			echo json_encode($result);
		}

function check_md_popup(){//일정관리 수정
			$this->load->model('Check_m');
			
			$ck_pk =  $this->input->get('data', true);

			$data['list'] = $this->Check_m->ck_md_info($ck_pk);

			$this->load->view('gigwan/check_md_v', $data);
		}

--모델--

function ck_regit($data){//일정관리 등록

		$ck = $this->load->database('ck', true);
	    $sql = 'insert into jds_check(gg_pk, ck_gg_da, ck_pur, ck_ct, ck_result, ck_da, ck_de_ct, ck_backup, ck_cpu, ck_update, ck_memory, ck_memo, ck_up_da, ck_up_name, ck_pc_name) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)';
		
		$result = $ck->query($sql, array($data['gg_pk'], $data['ck_gg_da'], $data['ck_pur'], $data['ck_ct'], $data['ck_result'], $data['ck_da'], $data['ck_de_ct'], $data['ck_backup'], $data['ck_cpu'], $data['ck_memory'], $data['ck_update'], $data['ck_memo'], $data['ck_up_da'], $data['ck_up_name'], $data['ck_pc_name']));
		
		return $result;
	}

	function ck_list($data){//일정관리 전체 데이터 출력
	
		$ck = $this->load->database('ck', true);
		
		$sql = 'select ck_pk, ck_gg_da, ck_pur, ck_ct, ck_result from jds_check where gg_pk = ? order by ck_gg_da  desc';

		$query = $ck->query($sql, $data);

		$result = $query->result();

		return $result;
	}

	function ck_detail($data){//클릭한 일정관리 상세데이터 출력
		
		$ck = $this->load->database('ck', true);

		$sql ='select ck_pk, ck_up_da, ck_da, ck_de_ct, ck_backup, ck_cpu, ck_memory, ck_update, ck_memo, ck_up_name, ck_pc_name from jds_check where ck_pk=?';

		$query = $ck->query($sql, $data);

		$result = $query->row();
		
		return $result;
		
	}

	function ck_md_info($data){//수정할 일정관리의 상세정보 출력
		
		$ck = $this->load->database('ck', true);
		
		$sql = 'select ck_pk, ck_gg_da, ck_pur, ck_ct, ck_result, ck_da, ck_de_ct, ck_backup, ck_cpu, ck_memory, ck_update, ck_memo, ck_up_da, ck_up_name, ck_pc_name from jds_check where ck_pk=?';

		$query = $ck->query($sql, $data);

		$result = $query->row();

		return $result;

	}

--jquery--

$('.ck_info').click(function(){//1개의 일정관리 클릭시 jquery ajax통신하는 곳
		var ck_pk = $(this).parents('tr').find('input[name="ck_pk"]').val();

		var no = $(this).parents('tr').attr('id');
			 no = no.split("_")[1];

			 if($('#hd_'+no).css('display') == 'none'){	
				
				$("[id^='hd_']").css("display", "none");
				$('#hd_'+no).css("display", "table-row");

				$.ajax({
					type:'post',
					url:'http://172.19.93.9/jds/index.php/gigwan_c/ck_detail',
					dataType:'json',
					data:{
						ck_pk: ck_pk
					},
					success:function(data){
							var output='<table>';
							output +='<tr>';
							output +='<input type="hidden" name="ck_pk" value="'+data.ck_pk+'" />';
							output +='<td>등록일자</td>';
							output +='<td>'+data.ck_up_da+'</td>';
							output +='<td>처리일자</td>';
							output +='<td>'+data.ck_da+'</td>';
							output +='</tr>';
							output +='<tr>';
							output +='<td>세부내용</td>';
							output +='<td>'+data.ck_de_ct+'</td>';
							output +='<td>백업상태</td>';
							if(data.ck_backup == 0){						
							output +='<td>점검</td>';
							}else{
							output +='<td>확인</td>';
							}
							output +='</tr>';
							output +='<tr>';
							output +='<td>CPU사용량</td>';
							output +='<td>'+data.ck_cpu+'</td>';
							output +='<td>메모리사용량</td>';
							output +='<td>'+data.ck_memory+'</td>';
							output +='</tr>';
							output +='<tr>';
							output +='<td>os업데이트</td>';
							if(data.ck_update == 0){
							output +='<td>N</td>';
							}else{
							output +='<td>Y</td>';
							}
							output +='<td>메모</td>';
							output +='<td>'+data.ck_memo+'</td>';
							output +='</tr>';
							output +='<tr>';
							output +='<td>등록자</td>';
							output +='<td>'+data.ck_up_name+'</td>';
							output +='<td>처리자</td>';
							output +='<td>'+data.ck_pc_name+'</td>';
							output +='</tr>';
							output +='</table>';
							output  +='<input type="button" name="check_modify" value="수정">';
							$('#hd_'+no+' .test').empty();
							$('#hd_'+no+' .test').append(output);
	
						},
					error:function(status, request, error){
					alert("code:"+request.status+"\n"+"message:"+request.responseText+"\n"+"error"+error);
					}
				});//ajax
			 
			 }else{
					$('#hd_'+no).hide();

			 }//if			
	});

수정할 일정관리 클릭시 수정팝업을 띄움
$(document).on('click', 'input[name="check_modify"]', function(){
			alert( $(this).parents('tr').find('input[name="ck_pk"]').val());
			var ck_pk = $(this).parents('tr').find('input[name="ck_pk"]').val();
			var popUrl ="http://172.19.93.9/jds/index.php/gigwan_c/check_md_popup/?data="+ck_pk;
		//var popUrl ="http://localhost/jds/index.php/gigwan_c/check_ad_popup/?data="+ck_pk;
		var popoption = "width=1200, height=800, resizable=no, scrollbars=no, status=no;";
		window.open(popUrl,"",popoption);
	});

 

 

 

 

 

 다음글 1.72 버전에서 사용중인 소스를 2.1에서 사용할 ... (1)
 이전글 테이블 데이터가져오기 하나의 모델에서 처리가능한지? (5)

댓글

배강민 / 2016/09/13 15:06:09 / 추천 0

1번을 클릭할때는 1번을 교체하고자, 2번을 클릭할때는 2번을 교체하고자 하시겠죠

그런데, 1,2번을 다닥 눌렀을 경우, 1번을 누룬후에 해당 함수의 no 변수에 1번이 있지만, 만약 1,2 눌렀는데 1,2 다 ajax 통신이 끝나기전이다라고 치겠습니다.

1,2번의 통신이 순서데로 끝났다면 그러면 아마도 2번만 교체될것으로 보여지는 구조입니다.

ajax 통신이 끝난후에 난 뭘 바꿔야할지 그놈이 알 수가 없습니다.

왜냐 난 1번을 누를때는 no 변수에 1을 넣었고, 2번을 누를대는 no 변수에 2를 넣었지만, 그 변수값을 ajax 통신한 놈이 알고 있을수가 없습니다.

이 부분에 대해서는 더 쉽게 설명드릴 자신이 없네요.

정수리 / 2016/09/13 15:09:39 / 추천 0

@배강민

아 그렇군요;

현재 구조는 2번을 보고 있다가 1번을 누르면 2번은 사라지고 1번만 출력되도록 하였는데

이것도 문제가 되는건가요?

 

정수리 / 2016/09/13 15:23:38 / 추천 0

@배강민

아 알겠습니다 ㅜㅜ

프로파일러를 사용해서 속도나 그런걸 확인하였는데

로딩이 길면

시간도 많이 늘어나야 하지 않나요?

로딩이 길지 않았을 때와 시간이 같네요 계속;;

배강민 / 2016/09/13 15:25:35 / 추천 0

문제가 될지 안될지에 대해 고민해보신 부분이 어떤건가요?

제가 답변 드린 부분은 무한루프 자체의 해결책인지는 모르겠다고 말씀드렸고, 코드만으로 봤을때 발생할듯 보이는 문제를 말씀드린겁니다.

문제가 없으시면 제 추측이 잘못된걸 수도 있고요. 고민해보시고, 테스트해보니 제 답변이 맞다면 고치시면 됩니다.

전, 무한루프의 원인은 모르겠습니다. 또, 제가 말씀드린 부분이 맞다면 더 쉽게 설명드릴 재주도 없습니다. 죄송합니다.

배강민 / 2016/09/13 15:26:51 / 추천 0

프로파일러를 사용해서 속도나 그런걸 확인하였는데

로딩이 길면

시간도 많이 늘어나야 하지 않나요?

로딩이 길지 않았을 때와 시간이 같네요 계속;;

> 무슨 말씀이신지 모르겠습니다. 죄송합니다.

정수리 / 2016/09/13 15:31:14 / 추천 0

@배강민

제가 워낙 말솜씨가 없어서 죄송합니다 ㅜㅜ

말씀하신 부분 비동기부분의 경우 이와 똑같은 형식으로 다른 메뉴에서도 적용하였을때는 아무 문제가 없었습니다

그렇기에 문제는 안될것 같습니다. 

메뉴 이동시에 로딩시간이 많이 걸리는데

특히  점검&일정관리 외에 메뉴들끼리 이동시에는 아무 문제가 없으나

점검&일정관리->다른메뉴

다른메뉴->점검&일정관리

이렇게 이동할때 로딩시간이 오래걸릴때가 있네요 ㅜㅜ

프로파일러의 

벤치마크부분에서

loading Time:Base Classes

Controller Execution Time

Total Execution Time

이 세개의 시간이 보통 0,0041, 0.0125, 0.0166

이렇게 나옵니다.

로딩이 길어지고 페이지가 출력이 되었을때 

저 새개의 시간이 전보다 훨씬 늘어나야 하지 않나요?

그런데 로딩이 길어진 후에 출력되었을때 시간이 전보다 거이 차이가 없을 정도의 시간이 나타나네요;

배강민 / 2016/09/13 15:55:39 / 추천 0

제가 좀 흥분해서 답변을 달았네요. 죄송합니다.

무한루프는 제외하고, 제가 말씀드린 부분에 대해서만 추측을 해본다면,

1번을 눌렀을때에 sleep(10)을 준다면 (서버상황이던 특정 통신이 오래걸리게 해보는 겁니다.)

이상태에서 1,3번을 연타로 누른다면

#01. 1번이 일단 상세정보를 다 끄고 통신을 한다. 아직 통신이 안끝났다.

#02. 3번이 일단 상세정보를 다 끄고 통신을 한다. 통신이 끝났다. 3번 상세정보를 연다.

#03. 1번 통신이 뒤늦게 끝났다. 상세정보를 넣고자하는데, 넣을곳을 못찾아서 error로 넘어간다. alert("code:"+request.status+"\n"+"message:"+request.responseText+"\n"+"error... 를 띄운다.

이상황이 될듯해보인다는 겁니다.

물론, 완전친 않지만, 리스트 클릭시 딤드로딩같은거로 다른걸 못누르게 하고 있다면 이상황을 EndUse가 보긴 힘들듯 싶고요.

어디까지나 추측이니, 제가 잘못 추측한걸 수도 있습니다.

배강민 / 2016/09/13 15:59:08 / 추천 0

저 로드 타임은 php단의 총 로드시간입니다.

view 페이지에 무거운 뭔가가 있거나, 로딩되는 순간 다른 ajax콜이 많이 있다면 그건 따로 더해야합니다.

배강민 / 2016/09/13 16:00:10 / 추천 0
해당 페이지를 열때에, 피들러던 크롬 타임라인이던 뭐가 오랜시간을 잡아먹나 확인해보세요.
정수리 / 2016/09/13 16:25:31 / 추천 0

@배강민

아닙니다..제 질문을 보고 많이 답답해 하실거라 생각됩니다

질문도 잘해야 좋은답변을 얻는 것인데 제가 워낙 말솜씨도 없고 ㅜㅜ 다른사람들이 이해할수 있는게 구체적으로 설명을 잘 못하지 못하다보니..

사수도없이 혼자 코딩을 하다 보니 질문을 잘해야 하는건지 그런것도 부족하네요 죄송합니다.

말씀하신 대로 크롬타임라인으로 봐보니 scripting이라는 부분에서 시간이 많이 잡아먹더라구요

잘될때는 미친듯이 잘되는데 안될때는 너무 안되서 답답하네요 ㅜㅜ

비동기 부분의 경우 막클릭해서 로딩이 돌아갈때 중지버튼을 클릭하면 alert창으로 ajax의 error창이 뜨네요

kaido / 2016/09/14 05:48:38 / 추천 0

댓글만 보고 정리좀 해보겠습니다.

 

1. 모든 페이지의 실제 호출 속도는 0.0xxx 초 단위로 그렇게 느리지 않다.

2. 그런데 ajax 호출을 할때 무한 로딩이 걸리고 있다.

3. ajax를 여러번 호출 하는 로직이다.

 

이렇게 3가지 인가요?

 

만일 ajax를 여러번 호출로 생기는  문제이라면 이건 ajax 자체가 가지고 있는 문제입니다.

ajax도 싱글톤 리턴을 하는 물건입니다.

로직상으로 첫번째 통신과 두번째 통신이 차례로 일어나도 두번째가 먼저 들어올 수도 있습니다.

동시에 들어오면 딱 하나를 먼저 들여보냅니다. 

다만 스크립트는 융통성이 없는 무도리 녀석이라, 순서가 꼬이면 생길수 있는 문제를 돌직구로 표현합니다.

[즉 에러가 생긴 다는 소리]

 

이 문제를 해결 하기 위해서는 프로미스 패턴을 사용합니다.

ajax promise 패턴을 검색해 보세요.

정수리 / 2016/09/19 10:34:33 / 추천 0

@kaido 

답변감사합니다. 이제 확인하였네요

말씀하신 google를 통해 promise 패턴을 검색하여 작성 해보았는데 

var promise =	$.ajax({
					type:'post',
					url:'http://172.19.93.9/jds/index.php/gigwan_c/ck_detail',
					dataType:'json',
					data:{
						ck_pk: ck_pk
					}
			});
			promise.done(function(data){
							var output='<table>';
							output +='<tr>';
							output +='<input type="hidden" name="ck_pk" value="'+data.ck_pk+'" />';
							output +='<td>등록일자</td>';
							output +='<td>'+data.ck_up_da+'</td>';
							output +='<td>처리일자</td>';
							output +='<td>'+data.ck_da+'</td>';
							output +='</tr>';
							output +='<tr>';
							output +='<td>세부내용</td>';
							output +='<td>'+data.ck_de_ct+'</td>';
							output +='<td>백업상태</td>';
							if(data.ck_backup == 0){						
							output +='<td>점검</td>';
							}else{
							output +='<td>확인</td>';
							}
							output +='</tr>';
							output +='<tr>';
							output +='<td>CPU사용량</td>';
							output +='<td>'+data.ck_cpu+'</td>';
							output +='<td>메모리사용량</td>';
							output +='<td>'+data.ck_memory+'</td>';
							output +='</tr>';
							output +='<tr>';
							output +='<td>os업데이트</td>';
							if(data.ck_update == 0){
							output +='<td>N</td>';
							}else{
							output +='<td>Y</td>';
							}
							output +='<td>메모</td>';
							output +='<td>'+data.ck_memo+'</td>';
							output +='</tr>';
							output +='<tr>';
							output +='<td>등록자</td>';
							output +='<td>'+data.ck_up_name+'</td>';
							output +='<td>처리자</td>';
							output +='<td>'+data.ck_pc_name+'</td>';
							output +='</tr>';
							output +='</table>';
							output  +='<input type="button" name="check_modify" value="수정">';
							$('#hd_'+no+' .test').empty();
							$('#hd_'+no+' .test').append(output);	
						}).fail(function(status, request, error){
					alert("code:"+request.status+"\n"+"message:"+request.responseText+"\n"+"error"+error);
				});

 

이렇게 하였는데도 로딩이 길어지네요 ㅜㅜ 제가 잘못작성한것 일까요...