2009-10-01 9 views
7

Gdy wydajność jest ważna, łącznie z pamięcią serwera, jestem ciekawy, czy używasz bufora wyjściowego: jak ob_start(); w PHP ma JAKIEKOLWIEK osiągi wydajności ponad nieużywanie go? Czy używa więcej pamięci lub czegokolwiek, aby go użyć?Czy buforowanie wyjściowe w PHP wymaga więcej zasobów?

W mojej sytuacji na stronie o dużym natężeniu ruchu, w której potrzebuję całej pamięci na memcache i APC oraz wszystkich innych czynności na serwerze, jestem ciekawy, czy powinienem go użyć, czy nie, jedyny prawdziwy powód, dla którego jest przydatny dla mnie jest przekierowanie stron, wysyłanie nagłówków, które powinienem powiedzieć po wysłaniu nagłówka, moja strona ma konfigurację nagłówka, ciała, stopki, więc czasem muszę przekierować w zależności od tego, co jest w pliku treści, więc jeśli nagłówek jest już pokazany ekran jonowy, który stwarza problem, użycie buforowania wyjściowego to jedno rozwiązanie, ale są inne rozwiązania, więc po prostu ciekawi mnie wydajność

Odpowiedz

1

Myślę, że najlepiej jest używać go z witryną o dużym natężeniu ruchu, lub co najmniej wyłączyć ukryty kolor, aby unikaj wysyłania częściowych odpowiedzi przez sieć, ponieważ może spowolnić resztę skryptu, jeśli odbiornik jest bardzo wolny.

Wysyłając całą odpowiedź w jednym czasie, uwalniasz wszystkie zasoby używane przez skrypt php, dzięki czemu jest bardziej wydajny.

+0

Właśnie przeczytałem również bufor wyjściowy PHP abit abt. myślę, że będzie wymagać pamięci serwera do przechowywania całej strony b4 wysyłając go jako 1 kawałek w prawo? więc może jest szansa, że ​​użyje więcej pamięci niż bez buforowania? – iceangel89

+0

@ iceangel89, który był moją początkową troską i czego naprawdę chciałbym się dowiedzieć – JasonDavis

+0

Przepraszam, że zapomniałem wspomnieć o tym punkcie ... Myślę, że obciążenie bufora wyjściowego jest ważne, gdy używamy gzhandler do kompresji. Dla prostego buforowania, przechowuje wszystko w pamięci, ale nie sądzę, że zobaczysz ogromną różnicę (duże strony html nie przekraczają 200K, prawda?). Możesz to łatwo przetestować za pomocą metody memory_get_usage() z buforowaniem wyjściowym i bez niego. –

3

Istnieją dwa powody, dla których buforowanie wyjścia jest przydatna

  1. Do wykonywania więc nie Czekają na gniazdko sieciowe być dostępny za każdym razem echo.
  2. Aby uniknąć wcześniejszego wysyłania nagłówków . Po wysłaniu do przeglądarki zawartości należy również wysłać nagłówki , po wykonaniu tej czynności , a następnie nie można ich zmodyfikować, np. . jeśli chcesz ustawić plik cookie lub zmień typ zawartości.

Istnieje oczywiście kara za przechowywanie wszystkiego w pamięci do końca żądania. Powinno to być zwykle niewielkie w porównaniu z ogólnym rozmiarem procesu PHP. To znaczy, chyba że planujesz wysłać ogromny plik w dół. W takim przypadku można okresowo przepłukiwać bufor za pomocą ob_flush() i flush() (lub tymczasowo całkowicie wyłączyć bufor), aby zmniejszyć wykorzystywaną pamięć szczytową.

Moim zdaniem powinieneś mieć go cały czas i usunąć go w wyjątkowych przypadkach.

Powiązane problemy