Sem o buffer de saída (o padrão), seu HTML é enviado ao navegador em partes, à medida que o PHP processa seu script. Com o buffer de saída, seu HTML é armazenado em uma variável e enviado ao navegador como uma peça no final do seu script.
Vantagens do buffer de saída para desenvolvedores da Web
Ativar o buffer de saída sozinho diminui a quantidade de tempo necessária para fazer o download e renderizar nosso HTML, porque ele não está sendo enviado em partes ao navegador enquanto o PHP processa o HTML.
Todas as coisas sofisticadas que podemos fazer com seqüências de caracteres PHP, agora podemos fazer com toda a nossa página HTML como uma variável.
Se você já encontrou a mensagem "Aviso: não é possível modificar as informações do cabeçalho - cabeçalhos já enviados por (saída)" durante a configuração de cookies, ficará feliz em saber que o buffer de saída é a sua resposta.
+1. Aqui está outro link útil: php.net/manual/en/function.ob-start.php - também útil ao lidar com uma função que ecoa um valor que você prefere armazenar em uma variável.
Cam
É realmente tudo armazenado em buffer até o fim, ou a página aparecerá em pedaços se eu tiver uma página realmente comprida?
Zedoo 14/05
5
@zedoo, se você começar a armazenar em buffer ob_start(), realmente tudo será armazenado em buffer. existe um segundo parâmetro opcional para ob_start(), int $chunk_sizeque, se definido, fará com que o buffer seja liberado após qualquer chamada de saída que faça com que o comprimento do buffer seja igual ou exceda esse tamanho.
machado.
12
Se você receber "Aviso: não é possível modificar as informações do cabeçalho", isso significa que você precisa auditar seu código primeiro, pois ativar o buffer de saída é uma correção do sintoma e não a causa. Algo está escrevendo antes da sua vez. Então, eu discordo, mas não o suficiente para responder com resposta.
Glenn Plas
5
Eu vejo apenas aventuras de uso de buffer, então por que ele não está ativado por padrão no php?
Thomas Banderas
69
O buffer de saída é usado pelo PHP para melhorar o desempenho e executar alguns truques.
Você pode fazer com que o PHP armazene toda a saída em um buffer e produza tudo ao mesmo tempo, melhorando o desempenho da rede.
Você pode acessar o conteúdo do buffer sem enviá-lo de volta ao navegador em determinadas situações.
A mesma pergunta aqui para Ax: não iniciar o buffer de saída sem desativá-lo mais tarde, fará com que seu script seja executado em todos os tipos de problemas?
Edward Stumperd 24/09/12
1
O buffer é liberado quando você chama um dos métodos de descarte (por exemplo, ob_flush()ou ob_end_flush()). O conteúdo do buffer também é liberado quando o script termina, de forma abrupta ou não, para que não haja problemas.
Salman A
17
Eu sei que essa é uma pergunta antiga, mas eu queria escrever minha resposta para os alunos de visual. Não consegui encontrar diagramas explicando o buffer de saída na Web mundial, então fiz um diagrama no Windows mspaint.exe.
Se o buffer de saída estiver desativado, os echodados serão enviados imediatamente para o Navegador.
Se o buffer de saída estiver ativado, um echoenviará dados para o buffer de saída antes de enviá-los ao Navegador.
phpinfo
Para ver se o buffer de saída está ativado / desativado, consulte phpinfo na seção principal. A output_bufferingdiretiva informará se o buffer de saída está ativado / desativado.
Nesse caso, o output_bufferingvalor é 4096, o que significa que o tamanho do buffer é 4 KB. Isso também significa que o buffer de saída está ativado no servidor da Web.
php.ini
É possível ativar / desativar e alterar o tamanho do buffer alterando o valor da output_bufferingdiretiva. Basta encontrá-lo php.ini, altere-o para a configuração de sua escolha e reinicie o servidor da Web. Você pode encontrar uma amostra do meu php.iniabaixo.
;Output buffering is a mechanism for controlling how much output data
;(excluding headers and cookies) PHP should keep internally before pushing that
; data to the client.If your application's output exceeds this setting, PHP
; will send that data in chunks of roughly the size you specify.
; Turning on this setting and managing its maximum buffer size can yield some
; interesting side-effects depending on your application and web server.
; You may be able to send headers and cookies after you've already sent output
; through printor echo.You also may see performance benefits if your server is; emitting less packets due to buffered output versus PHP streaming the output
;as it gets it.On production servers,4096 bytes is a good setting for performance
; reasons.;Note:Output buffering can also be controlled via OutputBufferingControl; functions.;PossibleValues:;On=Enabledand buffer is unlimited.(Usewith caution);Off=Disabled;Integer=Enables the buffer and sets its maximum size in bytes.;Note:This directive is hardcoded to Offfor the CLI SAPI
;DefaultValue:Off;DevelopmentValue:4096;ProductionValue:4096; http://php.net/output-buffering
output_buffering =4096
A diretiva output_bufferingnão é a única diretiva configurável em relação ao buffer de saída. Você pode encontrar outras diretrizes de buffer de saída configuráveis aqui: http://php.net/manual/en/outcontrol.configuration.php
Exemplo: ob_get_clean ()
Abaixo, você pode ver como capturar echoe manipulá-lo antes de enviá-lo ao navegador.
// Turn on output buffering
ob_start();
echo 'Hello World';// save to output buffer
$output = ob_get_clean();// Get content from the output buffer, and discard the output buffer ...
$output = strtoupper($output);// manipulate the output
echo $output;// send to output stream / Browser// OUTPUT:
HELLO WORLD
Exemplos: Hackingwithphp.com
Mais informações sobre o buffer de saída com exemplos podem ser encontradas aqui:
As funções de controle de saída permitem controlar quando a saída é enviada a partir do script. Isso pode ser útil em várias situações diferentes, especialmente se você precisar enviar cabeçalhos para o navegador depois que o script começar a produzir dados. As funções de controle de saída não afetam os cabeçalhos enviados usando header () ou setcookie (), apenas funções como echo () e dados entre blocos de código PHP.
ob_start();// turns on output buffering
$foo->bar();// all output goes only to buffer
ob_clean();// delete the contents of the buffer, but remains buffering active
$foo->render();// output goes to buffer
ob_flush();// send buffer output
$none = ob_get_contents();// buffer content is now an empty string
ob_end_clean();// turn off output buffering
Os buffers podem ser aninhados, portanto, enquanto um buffer está ativo, outro ob_start()ativa um novo buffer. Portanto, ob_end_flush()e ob_flush()realmente não estamos enviando o buffer para a saída, mas para o buffer pai. E somente quando não há buffer pai, o conteúdo é enviado ao navegador ou terminal.
ATUALIZAÇÃO 2019. Se você possui servidor dedicado e SSD ou melhor, NVM, 3.5GHZ. Você não deve usar o buffer para tornar o site carregado mais rapidamente em 100ms a 150ms.
A rede Becouse é lenta do que a obtenção de scripts no 2019 com servidores de desempenho (servidores, memória, disco) e com o PHP da APC ativado :) Para gerar scripts, às vezes, são necessários apenas 70ms, outra vez, apenas a rede leva tempo, de 10ms a 150ms do local usuário-servidor.
por isso, se você quer ser rápido em 150 ms, o buffer torna lento, pois precisa de dados adicionais do buffer de coleta, o que gera um custo extra. 10 anos atrás, quando o servidor cria o script 1s, era útil.
Por favor, tenha certeza de que o output_buffering tem limite, se você deseja usar o jpg para carregá-lo, pode liberar a automação e travar o envio.
Felicidades.
Você pode fazer river rápido ou você pode fazer tama com segurança :)
ob_start()
, realmente tudo será armazenado em buffer. existe um segundo parâmetro opcional paraob_start()
,int $chunk_size
que, se definido, fará com que o buffer seja liberado após qualquer chamada de saída que faça com que o comprimento do buffer seja igual ou exceda esse tamanho.O buffer de saída é usado pelo PHP para melhorar o desempenho e executar alguns truques.
Você pode fazer com que o PHP armazene toda a saída em um buffer e produza tudo ao mesmo tempo, melhorando o desempenho da rede.
Você pode acessar o conteúdo do buffer sem enviá-lo de volta ao navegador em determinadas situações.
Considere este exemplo:
O exemplo acima captura a saída em uma variável em vez de enviá-la para o navegador. output_buffering está desativado por padrão.
Considere este exemplo:
fonte
ob_flush()
ouob_end_flush()
). O conteúdo do buffer também é liberado quando o script termina, de forma abrupta ou não, para que não haja problemas.Eu sei que essa é uma pergunta antiga, mas eu queria escrever minha resposta para os alunos de visual. Não consegui encontrar diagramas explicando o buffer de saída na Web mundial, então fiz um diagrama no Windows
mspaint.exe
.Se o buffer de saída estiver desativado, os
echo
dados serão enviados imediatamente para o Navegador.Se o buffer de saída estiver ativado, um
echo
enviará dados para o buffer de saída antes de enviá-los ao Navegador.phpinfo
Para ver se o buffer de saída está ativado / desativado, consulte phpinfo na seção principal. A
output_buffering
diretiva informará se o buffer de saída está ativado / desativado.Nesse caso, o
output_buffering
valor é 4096, o que significa que o tamanho do buffer é 4 KB. Isso também significa que o buffer de saída está ativado no servidor da Web.php.ini
É possível ativar / desativar e alterar o tamanho do buffer alterando o valor da
output_buffering
diretiva. Basta encontrá-lophp.ini
, altere-o para a configuração de sua escolha e reinicie o servidor da Web. Você pode encontrar uma amostra do meuphp.ini
abaixo.A diretiva
output_buffering
não é a única diretiva configurável em relação ao buffer de saída. Você pode encontrar outras diretrizes de buffer de saída configuráveis aqui: http://php.net/manual/en/outcontrol.configuration.phpExemplo: ob_get_clean ()
Abaixo, você pode ver como capturar
echo
e manipulá-lo antes de enviá-lo ao navegador.Exemplos: Hackingwithphp.com
Mais informações sobre o buffer de saída com exemplos podem ser encontradas aqui:
http://www.hackingwithphp.com/13/0/0/output-buffering
fonte
http://php.net/manual/en/book.outcontrol.php
Mais recursos:
Buffer de saída com PHP
fonte
Como nome, sugira aqui o buffer de memória usado para gerenciar como a saída do script aparece.
Aqui está um ótimo tutorial para o tópico
fonte
Os buffers podem ser aninhados, portanto, enquanto um buffer está ativo, outro
ob_start()
ativa um novo buffer. Portanto,ob_end_flush()
eob_flush()
realmente não estamos enviando o buffer para a saída, mas para o buffer pai. E somente quando não há buffer pai, o conteúdo é enviado ao navegador ou terminal.Bem explicado aqui: https://phpfashion.com/everything-about-output-buffering-in-php
fonte
ATUALIZAÇÃO 2019. Se você possui servidor dedicado e SSD ou melhor, NVM, 3.5GHZ. Você não deve usar o buffer para tornar o site carregado mais rapidamente em 100ms a 150ms.
A rede Becouse é lenta do que a obtenção de scripts no 2019 com servidores de desempenho (servidores, memória, disco) e com o PHP da APC ativado :) Para gerar scripts, às vezes, são necessários apenas 70ms, outra vez, apenas a rede leva tempo, de 10ms a 150ms do local usuário-servidor.
por isso, se você quer ser rápido em 150 ms, o buffer torna lento, pois precisa de dados adicionais do buffer de coleta, o que gera um custo extra. 10 anos atrás, quando o servidor cria o script 1s, era útil.
Por favor, tenha certeza de que o output_buffering tem limite, se você deseja usar o jpg para carregá-lo, pode liberar a automação e travar o envio.
Felicidades.
Você pode fazer river rápido ou você pode fazer tama com segurança :)
fonte