Respostas:
Buffer de saída para desenvolvedores da Web, um guia para iniciantes :
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.
ob_start()
, realmente tudo será armazenado em buffer. existe um segundo parâmetro opcional para ob_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:
<?php
ob_start( );
phpinfo( );
$output = ob_get_clean( );
?>
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:
<?php
ob_start( );
echo "Hello World";
if ( $some_error )
{
header( "Location: error.php" );
exit( 0 );
}
?>
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.
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á-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.ini
abaixo.
; 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 print or 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 Output Buffering Control
; functions.
; Possible Values:
; On = Enabled and buffer is unlimited. (Use with caution)
; Off = Disabled
; Integer = Enables the buffer and sets its maximum size in bytes.
; Note: This directive is hardcoded to Off for the CLI SAPI
; Default Value: Off
; Development Value: 4096
; Production Value: 4096
; http://php.net/output-buffering
output_buffering = 4096
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.php
Exemplo: ob_get_clean ()
Abaixo, você pode ver como capturar echo
e 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.
http://php.net/manual/en/book.outcontrol.php
Mais recursos:
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
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.
Bem explicado aqui: https://phpfashion.com/everything-about-output-buffering-in-php
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 :)