FirePHP i Firebug oraz błąd Headers already sent… Cannot send log data to FirePHP. You must have Output Buffering enabled via ob_start() or output_buffering ini directive…

FirePHP to dodatkowy moduł dla rozszerzenia Firebug. Umożliwia on logowanie na konsole Firebug informacji prosto z poziomu kodu PHP. Jednakże, podczas korzystania z FirePHP może nas spotkać przykra niespodzianka i zobaczymy błąd postaci:

Fatal error: Uncaught exception ‘Exception’ with message ‘Headers already sent in C:\wamp\www\firephp.php on line 5. Cannot send log data to FirePHP. You must have Output Buffering enabled via ob_start() or output_buffering ini directive.’ in C:\wamp\www\FirePHPCore\FirePHP.class.php on line 1178

Zanim wytłumaczę, jak rozwiązać ten problem, opiszę w kilku zdaniach, jak działa moduł FirePHP. Otóż gdy uruchamiamy stronę WWW (może to być zarówno zwykły HTML, PHP, czy cokolwiek innego), do przeglądarki wysyłana jest odpowiedź składająca się z dwóch części – najpierw wysyłane są nagłówki (zawierające oprócz informacji technicznych związanych ze stroną, takie rzeczy jak dane POST etc.), a następnie wysyłana jest treść strony.

Z poziomu PHP również możemy wysyłać nagłówki do przeglądarki za pomocą funkcji header(). Przykładowym powodem, dla którego możemy chcieć wysyłać jakieś nagłówki do przeglądarki jest dla przykładu przekierowanie

header(‘Location: http://www.example.com/’);

lub chęć przesłania obrazka zamiast zwykłego HTMLa

header(„Content-type: image/png”);

Należy tu jednak pamiętać o jednej bardzo ważnej zasadzie. Nagłówki mogą być wysyłane, do momentu, gdy nie wyślemy do przeglądarki zwykłej zawartości – np. poprzez komendę echo lub poprzez tekst umieszczony poza tagami <?php ?>. Jeżeli taka zawartość zostanie wysłana, to próba wysłania kolejnych nagłówków skończy się tytułowym błędem.

I teraz wróćmy do naszego FirePHP. Działa on właśnie dzięki wysyłaniu do przeglądarki specyficznych nagłówków, które dalej są interpretowane przez rozszerzenie w Firefoxie. Wyglądają one mniej więcej tak:

X-Wf-Protocol-1		http://meta.wildfirehq.org/Protocol/JsonStream/0.2
X-Wf-1-Plugin-1		http://meta.firephp.org/Wildfire/Plugin/FirePHP/Library-FirePHPCore/0.3
X-Wf-1-Structure-1	http://meta.firephp.org/Wildfire/Structure/FirePHP/FirebugConsole/0.1
X-Wf-1-1-1-1		104|[{"Type":"LOG","Label":"Iterators","File":"C:\\wamp\\www\\firephp.php","Line":"11"},{"i":"15","j":"20"}]|

Jeżeli chcemy, aby FirePHP działał poprawnie, musimy upewnić się, że nie wysyłamy do przeglądarki żadnej zawartości nim wszystkie nagłówki zostaną przesłane. Najprościej jest to zrobić przez mechanizm zwany buforowaniem wyjścia. Mechanizm ten polega na tym, że cała zawartość, która normalnie byłaby wysyłana do przeglądarki od razu, jest zapisywana w specjalnym buforze. Nagłówki nie są buforowane i są przesyłane do przeglądarki od razu. Bufor z zawartością jest jednak wysyłany dopiero na samym końcu strony – już po wszystkich nagłówkach.

Aby włączyć ten mechanizm możemy umieścić w pliku php.ini odpowiednią dyrektywę

output_buffering = On

lub możemy na początku pliku PHP umieścić funkcję

ob_start()

Połączenie tych dwóch metod nie spowoduje żadnego błędu – po prostu zostaną uruchomione dwa bufory, jeden na drugim.