O que é buffer de saída?

201

O que é buffer de saída e por que alguém o está usando no PHP?

Abhimanyu
fonte

Respostas:

274

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.
machado.
fonte
6
+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.

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.

  • Você pode usar o buffer de saída em situações em que deseja modificar os cabeçalhos após o envio do conteúdo.

Considere este exemplo:

<?php
    ob_start( );
    echo "Hello World";
    if ( $some_error )
    {
        header( "Location: error.php" );
        exit( 0 );
    }
?>
Salman A
fonte
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.

insira a descrição da imagem aqui

Se o buffer de saída estiver ativado, um echoenviará dados para o buffer de saída antes de enviá-los ao Navegador.

insira a descrição da imagem aqui

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.

insira a descrição da imagem aqui 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 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_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:

http://www.hackingwithphp.com/13/0/0/output-buffering

Julian
fonte
9

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:

Buffer de saída com PHP

Sarfraz
fonte
4

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

nik
fonte
1
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

sudip
fonte
0

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 :)

Kamil Dąbrowski
fonte