php 는 flush() 를 하기전까지는 아무것도 출력하지 않습니다.
그래서 최종 결과물의 헤더에는 Content-Length 가 있죠.

flush() 를 하는 순간 chunked 헤더를 날리고,
현재까지 버퍼의 내용을 출력합니다.
Content-Length 대신 chunk 데이터 앞에 chunk 크기가 주어집니다.

그러면 브라우저가 그것을 받아서 화면에 뿌려주죠.
페이지가 완성되지 않아도 화면을 구성할 수 있게되는 것입니다.

문제는 익스플로러가 이런 chunk 되지 않은
plain text 로 넘어오는 정보마저 받다말고 렌더링을 하려 하는것 같다는 것입니다.

해외에서의 접속을 좀 빨리 해볼 생각으로 페이지 압축전송을 했다가 우연히 발견하게 되었습니다.

다중중첩테이블 등에 의해 렌더링에 자원소모가 상당히 심한 페이지었는데,
압축전송을 한것 만으로 익스플로러에서는 눈에 띄게 렌더링이 빨라졌습니다.
(불여우에서는 원래 빨랐습니다. 그래도 약간의 향상은 있더군요.)

해외에서의 접속에도 생각 이상의 효과를 봤습니다.
전송속도를 체크해 보려고 수십메가의 파일을 다운로드해 봐도,
국내에서 다운받는것과 비슷한 속도가 났는데,
유독 php 페이지만 느리게 출력됐었습니다.
단지 압축전송을 한것만으로 그렇게 빨라지는것이 이해되지는 않지만,
결과가 좋아 만족합니다.
(서버는 한국, 대상은 일본이고,
한일간의 주요 네트워크 장비중 한->일 방향에서,
텍스트 필터링을 하는 뭔가가 있지 않나 생각해봅니다.)


결론은 압축전송 입니다.
php 에서 간단히 구현할 수 있는것이
ob_gzhandler 입니다.
zlib 를 설치하면 사용할 수 있습니다.

ob_start('ob_gzhandler');
하면,
출력되는 모든 정보가 압축이 되고,
브라우저가 이를 풀어서 보여줍니다.

이렇게 하면 압축이 되었으므로,
모두 받아서 풀기전까지는 브라우저가 내용을 보여줄 수 없습니다.

이것의 단점은 flush() 의 불가 라는 점입니다.
ob_flush() 는 무시되고,
flush() 를 하면 chunked 헤더를 날리지만,
결국에는 하나로 압축되어 한덩어리의 chunk 데이터만 보내집니다.

해외에서의 접속에서 flush() 가 필요하다면,
압축전송을 포기하거나,
직접 작성할 수 밖에 없습니다.

ob_handler 와 ob_flush 를 직접 작성하면,
flush() 와 연동해서 충분히 제작 가능합니다.

템플릿을 사용한다면 flush() 를 위해
ob_start 를 안하고 있다가,
템플릿 출력시에 동작하게 하면 간단히 적용하기에 좋을것입니다.


출처 : http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=53266&sca=%BA%EA%B6%F3%BF%EC%C0%FA
Posted by 철냄비짱
,