테스트 사이트 - 개발 중인 베타 버전입니다

PHP 로직 실행과정을 웹페이지에 런타임현시

· 2년 전 · 923 · 2

이미 Q&A에 질문이 있어 답글을 올렸지만 모두가 알고 이용하는게 좋을 상 싶어 여기서 별도로 다시 글을 올립니다.

실례를 든다면, 이미지를 업로드 하면 PHP쪽에서 upload.php파일이

1. 리사이즈 (로직실행시간 500ms) echo "이미지 리사이징하고 있습니다.";

2. 서버에 저장 (로직실행시간 100ms) echo "서버에 저장중입니다.";

3. 디비에 등록 (로직실행시간 30ms) echo "디비에 이미지정보를 등록하고 있습니다.";

4. 결과 출력 (로직실행시간 10ms) echo "조작완료";

이런 4개의 단계가 작동한다고 가정하면

요청접수하여 시작부터 마지막 로직까지 출력하는데 모두 640ms 로, 매 로직별러 echo 한 글짜가 출력되는게 아니라, 4번단계까지 다 실행되어 웹페이지에 한번에

[code]

이미지를 리사이징하고 있습니다.

서버에 저장중입니다.

디비에 이미지정보를 등록하고 있습니다.

조작완료

[/code]

출력되어집니다.

그러나 원코저 하는것은 

매 단계에서 웹브라우저에 

1. 이미지를 리사이징하고 있습니다.

2. 서버에 저장중입니다.

3. 디비에 이미지정보를 등록하고 있습니다.

4. 조작완료

이런식으로 매 단계로직이 실행될때마다 웹브라우저에 출력시키는 문제입니다.
 

이 문제를 해결하자면 PHP의 버퍼기능을 사용합니다.

ob_로 시작되는 PHP함수들은 모두 버퍼기능에 연관있는 함수들입니다.

[code]

/**
 * 실행시간이 오랜 어떤 로직이 도중도중 어떤 부분을 실행중인가를 동적으로 출력할 필요가 있을때 이 메소드를 사용하면 된다.
 * 수많은 공백을 덧붙이는것은 어떤 경우(Browser종류나, 서버형태 등)에는 하나씩하나씩 실시간 출력이 안될때도 있기때문이다.
 * @param $msg 출력값
 * @param $whitespace 공백개수
 */
function obfPrint($msg, $whitespace=5000) {
    $out = $msg.str_repeat(" ", $whitespace);
    echo $out;
    
    @ob_end_flush();
    @ob_flush();
    @flush();
    @ob_start();
}

// 1초간격으로(PHP에서 실행중인 로직이 1초걸린다고 가정) $i값 동적으로 출력
for ($i=0;$i<10;$i++)
{
    obfPrint($i."</br>",0);
    usleep(1000000);
}

[/code]

코드를 한번 실행 해 보시면 이해가 더 잘 되십니다.

따라서 위의 실례 역시 obfPrint() 를 쓰면 런타임 출력문제가 해결됩니다.

[code]

// 1. 이미지 리사즈 로직 부분

obfPrint('이미지를 리사이징하고 있습니다.');

// 2. 서버 저장 로직 부분

obfPrint('서버에 저장중입니다.');

// 3. 디비에 이미지정보 등록 로직부분

obfPrint('디비에 이미지정보를 등록하였습니다.');

// 4. 조작완료 로직부분

obfPrint('조작을 완료하였습니다.');

[/code]

 

이해가 되시는죠? 한가지 참고드릴것은 런타임 현시는 PHP로직실행시간이 어느정도 걸릴때 효과가 있고 빠른 로직실행이라면 그냥 echo 로 단번에 출력된것처럼 보입니다.

마지막까지 봐주셔서 감사합니다.

댓글 작성

댓글을 작성하시려면 로그인이 필요합니다.

로그인하기

댓글 2개

좋은예제 공유해주셔서 감사합니다.
@라엘 이용해주어 감사합니다.

게시글 목록

번호 제목
17819
17818
17817
17816
17814
17811
17810
17809
17808
17803
17799
17798
17797
17795
17794
17793
JavaScript JSON Beautify
17790
17789
17786
17774
17760
17755
17750
17729
17722
17714
17708
17686
17676
17666