É melhor usar ob_get_contents () ou $ text = 'test'.;
-
08-07-2019 - |
Pergunta
Eu vi um monte de ob_get_clean()
o último tempo. Normalmente eu fiz $test .= 'test'
Eu estou querendo saber se alguém é mais rápido e / ou melhor do que o outro.
Aqui está o código usando ob_get_clean()
:
ob_start();
foreach($items as $item) {
echo '<div>' . $item . '</div>';
}
$test = ob_get_clean();
Aqui está o código usando $test .= 'test'
:
$test = '';
foreach($items as $item) {
$test .= '<div>' . $item . '</div>';
}
O que é melhor?
Solução
buffers de saída tem todas as armadilhas de variáveis ??globais. Você tem que estar ciente de todos os caminhos de execução do ob_start()
ao ob_get_clean()
. Tem certeza de que vai chegar lá, e que nenhum buffers abertos entre terão sido fechada? Tenha em mente que o código pode lançar exceções. Isso pode ser um divertimento bug realmente para o próximo cara de rastrear.
Por outro lado - e eu odeio mesmo de mencioná-lo - em um buffer de saída tempo foi um pouco mais rápido em concatenação de grandes cadeias, por razões internas para PHP. Eu não tenho certeza se isso ainda é verdade.
Outras dicas
Os resultados são os mesmos, e eu imagino que as diferenças de desempenho são insignificantes se houver. Basicamente, uma questão de preferência estilo pessoal. Eu iria com concatenação de mim -. Eu uso o buffer de saída apenas quando concatenação não é uma opção
Além disso, em vez de correr tanto ob_get_contents () e ob_clean () simplesmente executar ob_get_clean () que executa ambos ao mesmo tempo.
Se você estiver preocupado com a sobrecarga de concatenação você deve ser nota que este:
echo '
é mensurável mais lento do que isso:
echo '
O primeiro compila para baixo a dois concats cordas seguido de um eco, enquanto o segundo compila para baixo a apenas três ecos, o que é realmente mais rápido.
Eu acho que usando o buffer de saída pode ter uma pequena vantagem de desempenho quando você estiver usando cordas enormes, mas para uso comum você é melhor com concatenação na minha opinião como este código provavelmente será mais fácil de entender e depurar por outros.
Um pequeno ponto, mas se você estiver indo para usar a abordagem de buffer de saída, assim como você pode usá-lo completamente:
ob_start();
foreach($items as $item) {
echo '<div>';
echo $item;
echo '</div>';
}
$test = ob_get_clean();
Como mencionado acima, o buffer de saída é melhor para o desempenho. Para as grandes cadeias, a diferença de desempenho não é neglible em tudo. Você pode comparar a saída buffer em PHP para StringBuffer / StringBuilder em Java; para concatenação, a seqüência inteira precisa ser copiado na memória de cada vez. Para o buffer de saída, o texto vai para um buffer que cresce em incremements sensíveis, e não há necessidade de copiar os dados para cada saída.
Você também pode pensar em usar HTML inline (ainda mais rápido). benefício adicional para linha HTML é que seu IDE pode provavelmente executar destaque de sintaxe no HTML, o que não vai acontecer quando o HTML está dentro de uma seqüência de PHP. código modificado (short_open_tags = On obrigatório):
ob_start();
?>
<? foreach($items as $item) { ?>
<div><?= $item ?></div>
<? } ?>
<?
$test = ob_get_clean();