2010-09-04 17 views
6

Występują problemy z buforowaniem danych wyjściowych. Głównie, próbuję uruchomić buforowanie wyjściowe z wywołaniem ob_gzhandler, ale ciągle mówi mi, że używa on nieobsługiwanego typu kompresji. Wszystko włączone, i wierzę, że problemem jest to, że działa ob_get_level() na początku mojego skryptu wytwarza poziom 1. php.ini jest moja output_buffering ustawiony na 4096.ob_get_level() rozpoczyna się od poziomu 1

Jeśli uruchomię coś takiego:

while(ob_get_level() > 0){ 
    ob_end_clean(); 
} 

Następnie mogę z powodzeniem uruchomić ob_start() z wywołaniem ob_gzhandler. Ale zastanawiam się, czy to powinien być problem. Podczas mojego skryptu dzwonię do ob_clean() w różnych punktach, ponieważ unikam nakładania zbyt wielu buforów, ponieważ przeczytałem, że może to zwiększyć wydajność. Nie jestem pewien, co powinienem tu robić.

Pozdrawiam.

Odpowiedz

7

Domyślnie buforowanie danych wyjściowych jest włączone (patrz the docs) - oznacza to, że każdy skrypt PHP zaczyna się od ob_start().

Jeśli chcesz wyłączyć domyślne OB dla wszystkich skryptów PHP, w swoim php.ini, ustaw output_buffering = Off.

Jeśli chcesz wyłączyć domyślny OB dla tego konkretnego skryptu, użyj pętli while - to całkiem poprawne.

Co do numeru ob_clean - czy na pewno chcesz usunąć dane wyjściowe z bufora? IMO nie jest to naprawdę konieczne, chyba że widzisz znaczne wolne strony. Nie przejmuj się optymalizacją (przynajmniej nie teraz).

+0

Tak, uważam, że tak. Jest ustawiony jako: output_buffering = 4096 (co powiedziałem powyżej). Co mam do czynienia, czy powinienem zostawić to tak, jak jest, i po prostu uruchomić pętlę mam powyżej, tak, że mogę rozpocząć buforowanie wyjściowe ob_gzhandler? –

+0

@Jason Lewis: To zależy od ciebie. Prawdopodobnie zostawiłbym domyślny OB dla wszystkich skryptów i zakończyłbym go pętlą 'while' w przypadkach, w których chciałem użyć własnego. – Piskvor

+0

Miałem powiedzieć, że używam ob_get_clean() w kilku miejscach, do przechowywania danych wyjściowych w kilku zmiennych i ostatecznie jest przepłukiwany. Czy jest to dobry sposób na to, czy powinienem uruchomić nowy bufor dla każdego miejsca, w którym chcę przechwycić wynik i użyć ob_get_flush() zamiast? –

Powiązane problemy