출력 버퍼링은 출력물이 php에 파싱되어 echo나 print에 의해 브라우저로 출력되는 방법이 일반적인데, 필요에 의해 출력 결과물을 바로 브라우저로 보내지 않고, 내용물을 잠깐 동안 버퍼에 보관해 두었다가 출력이 필요할 곳에 이를 사용할 수 있습니다.

이를 사용하기 위애서는 ob_start()함수를 호출하고, ob_end_flush로 버퍼링을 비워주면 되는데, 여기서 비운다는 의미는 버퍼에 저장되어 있는 내용을 브라우저로 출력하고, 버퍼를 비운다는 뜻입니다.

<?php
 // 출력 버퍼링을 켭니다.
 ob_start();

 // 출력 결과물을 호출합니다.
 test();

 // 버퍼의 내용을 브라우저로 출력하고, 버퍼링을 비워 줍니다.
 // 그리고 출력 버퍼를 종료합니다.
 ob_end_flush();

 function test(){
      echo "php 하보니입니다.";
 }

 // 결과: php 하보니입니다.
 ?>

출력물을 비우기 전에 변수에 저장하고자 할때는 ob_get_contents를 사용합니다.

<?php
 // 출력 버퍼링을 켭니다.
 ob_start();

 // 출력 결과물을 호출합니다.
 test();

 // 출력 버퍼에 저장되어 있는 내용을 변수에 저장합니다.
 $data = ob_get_contents();

 // 버퍼의 내용을 브라우저로 출력하고, 버퍼링을 비워 줍니다.
 // 그리고 출력버퍼를 종료합니다.
 ob_end_flush();

 function test(){
      echo "php 하보니입니다.";
 }
 echo $data;
 // 결과: php 하보니입니다.php 하보니입니다.
 ?>

여기서 출력물을 ob_get_contents로 변수에 저장하고, 버퍼의 내용을 브라우저로 출력하지 않고, 그대로 비우길 원한다면, ob_end_clean를 사용하면 됩니다.

<?php
 // 출력 버퍼링을 초기화 합니다.
 ob_start();

 // 출력 결과물을 호출합니다.
 test();

 // 출력 버퍼에 저장되어 있는 내용을 변수에 저장합니다.
 $data = ob_get_contents();

 // 버퍼의 내용을 브라우저로 출력하지 않고, 그대로 버퍼링을 비웁니다.
 // 그리고 출력버퍼를 종료합니다.
 ob_end_clean();

 function test(){
      echo "php 하보니입니다.";
 }
 echo $data; // 결과: php 하보니입니다.
 ?>

다음과 같이 사용해도 동일합니다.

<?php
 // 출력 버퍼링을 초기화 합니다.
 ob_start();

 // 출력 결과물을 호출합니다.
 test();

 // 출력 버퍼에 저장되어 있는 내용을 변수에 저장하고,
 // 출력 버퍼를 비워 줍니다. 그러나 출력 버퍼는 종료하지 않습니다.
 $data = ob_get_clean();

 // 출력 결과물을 다시 호출합니다.
 test();

 // 출력 버퍼에 저장되어 있는 내용을 다시 변수에 저장하고,
 // 출력 버퍼를 비워 줍니다. 그리고 버퍼를 종료합니다.
 $data .= ob_get_clean();

 // 내용물을 출력하지 않고, 출력 버퍼를 비우고 종료합니다.
 ob_end_clean();

 function test(){
      echo "php 하보니입니다.";
 }
 echo $data; // 결과: php 하보니입니다.php 하보니입니다.
 ?>

<?php
 // 출력물을 브라우저로 출력하고, 버퍼를 비우고, 종료합니다.
 ob_end_flush();

 // 출력 버퍼를 브라우저로 출력하고, 버퍼를 비웁니다.
 ob_flush();

 // 출력물을 변수에 저장하고, 브라우저로 출력하고,
 // 출력 버퍼를 비우고 종료합니다.
 ob_get_flush();


 // 출력없이 버퍼를 비우고, 종료합니다.
 ob_end_clean();

 // 출력없이 버퍼만 비우고, 종료하지는 않습니다.
 ob_clean();

 // 출력물을 변수에 저장하고, 버퍼를 비우고, 버퍼를 종료합니다.
 ob_get_clean();


 // 출력물을 변수에 저장만 합니다.
 ob_get_contents();
?>

flush 함수는 출력물을 브라우저로 보내고, 출력 버퍼를 비우는 역할을 하지만, 서버나 클라이언트에 영향을 주지 않습니다.

그래서 ob_flush와 flush를 모두 호출해야 되는데, 몇몇 브라우저는 버퍼를 비우지 않고, 버퍼를 가지고 지속하는 경우가 있는데, 익스플로러 브라우저의 몇몇 버전은 256바이트를 출력받았을 때만 브라우저로 출력하기 때문에 여분의 공백 256바이트와 함께 실제적인 출력물을 전송하면 됩니다.

넷스케이프는 태그가 종료되거나 태그가 시작할 때까지 버퍼에 담아두는 경우도 있으니 참고하여야 합니다.

<?php
 // 출력 버퍼를 호출하고,
 ob_start();

 // 브라우저로 출력하고, 출력물을 비웁니다.
 ob_flush();
 flush();

 // 실제적인 출력물을 비워 줍니다.
 for($i=0;$i<1000;$i++){
      echo str_repeat("\n", 256);
      echo 'printing...<br />';
      ob_flush();
      flush();

      ob_clean();
      usleep(300000);
 }

 // 출력 버퍼를 종료합니다.
 ob_end_clean();
 ?>

2 댓글

  1. 크롬에서 하는 데 한꺼번에 나오는 데요.
    flush 를 사용하지 않고 컨텐츠타입을 event-strame 으로 하면 정상적으로 한개씩 한개씩 나오네요.

    답글삭제
    답글
    1. 아 그런가요? 나중에 테스트해 봐야겠네요. 감사합니다.

      삭제