Eduard Ereza Martínez
Localitzador de programari

Control de la sortida de PHP amb ob_start() i ob_flush()

8 de juliol del 2008

Avui hem decidit canviar el comportament de l’aplicació que estem desenvolupant perquè, en cas que la base de dades petés, era terriblement lleig tenir 200 warnings i errors de MySQL rondant pel mig de la web. Era més lògic mostrar una pàgina d’error perquè el client veiés que alguna cosa havia anat malament, i que ho provés més tard.

La idea inicial era simple. Hi ha la següent funció:

db_query($query)

Aquesta funció permet fer una consulta a la base de dades abstraient (una mica) l’aplicació del MySQL. A més, en cas d’error a la consulta, afegeix entrades al registre de l’aplicació i més coses. En fi, doncs la idea era simplement modificar la funció afegint-hi això en cas que hi hagués un error:

header("Location: error.php");

La idea està molt bé, però no és possible, perquè si l’error es produeix un cop s’ha iniciat la sortida, tindrem el típic problema de “headers already sent by”.

I és aquí on entren en joc les funcions de búfer ob_start() i ob_flush(). Aquestes funcions retenen i alliberen, respectivament, la sortida de l’aplicació, excepte les capçaleres. Per tant, això ens permet retenir la sortida fins que estiguen segurs que no hi pot haver cap error, i llavors executar ob_flush().

D’aquesta manera se solucionen els possibles problemes d’enviament de capçaleres quan ja hi ha sortida.