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?

Foi útil?

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 '

' $ test '
.';.

é mensurável mais lento do que isso:

echo '

', $ teste, '
';

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();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top