Apart from being mostly redundant, ob_end_flush() can be downright damaging in some weird cases.
Actual example: a particular page on an Intranet website which would appear blank on Internet Explorer 6 when ob_start('ob_gzhandler') was called in the beginning and ob_end_flush() at the end.
We couldn't figure out what made that page special no matter what we tried. The ob_ functions were placed in scripts which were include()'d by all pages just the same, but only that page did this.
Even stranger, the problem only appeared on direct browser/server connections. Whenever the connection passed through a proxy the problem dissapeared. I'm guessing some kind of HTTP encoding headers mumbo-jumbo.
Solution: unless you really need it in particular cases, remove the ob_end_flush() call and rely on the builtin, automatic buffer flush.
ob_end_flush
(PHP 4, PHP 5)
ob_end_flush — 출력 버퍼를 전송하고 출력 버퍼링을 종료합니다.
설명
이 함수는 (존재한다면) 최상위 출력 버퍼의 내용을 전송하고 출력 버퍼를 종료합니다. ob_end_flush()를 호출하면 버퍼의 내용이 비워지기 때문에, 버퍼의 내용으로 다른 작업을 하려면 ob_end_flush()를 호출하기 전에 ob_get_contents()를 호출해야 합니다. 하나의 버퍼를 처리하는데 성공하면 TRUE를, 그 외의 경우에는 FALSE를 반환합니다. 실패의 원인으로는 활성화된 버퍼 없이 함수를 호출했거나, 어떠한 이유로 버퍼를 삭제할 수 없는 경우(특수 버퍼의 경우)입니다.
Note: 이 함수는 ob_get_flush()가 버퍼를 문자열로 반환하는 점을 제외하면, ob_get_flush()와 동일합니다.
다음 예제는 모든 출력 버퍼를 전송 및 종료하는 간단한 방법을 보여줍니다:
Example#1 ob_end_flush() 예제
<?php
while (@ob_end_flush());
?>
Note: 함수가 실패하면 E_NOTICE를 발생합니다. 불린 반환값은 PHP 4.2.0에서 추가되었습니다.
참고: ob_start(), ob_get_contents(), ob_get_flush(), ob_flush(), ob_end_clean().
ob_end_flush
01-Jul-2005 02:10
05-Jun-2004 09:18
A note on the above example...
with PHP 4 >= 4.2.0, PHP 5 you can use a combination of ob_get_level() and ob_end_flush() to avoid using the @ (error suppresion) which should probably be a little faaster.
<?php
while (ob_get_level() > 0) {
ob_end_flush();
}
?>
29-Mar-2003 09:22
ob_end_flush() isn't needed in MOST cases because it is called automatically at the end of script execution by PHP itself when output buffering is turned on either in the php.ini or by calling ob_start().
26-Sep-2002 01:01
It appears that you can call ob_end_flush() regardless of whether or not output buffering was ever started using ob_start(). This can prove useful because it saves you from having to create conditional statements based on whether a particular function or include file has started output buffering. You can simply call the ob_end_flush() anyway and if there's output in the buffer, it will be sent, otherwise your script will just keep on keepin' on.
