Domanda

Ne ho visti molti ob_get_clean() l'ultimo momento.In genere ho fatto $test .= 'test'

Mi chiedo se uno è più veloce e/o migliore dell'altro.

Ecco il codice che utilizza ob_get_clean():

ob_start();

foreach($items as $item) {
    echo '<div>' . $item . '</div>';
}

$test = ob_get_clean();

Ecco il codice che utilizza $test .= 'test':

$test = '';

foreach($items as $item) {
    $test .= '<div>' . $item . '</div>';
}

Che è migliore?

È stato utile?

Soluzione

I buffer di output presentano tutte le insidie ​​delle variabili globali.Devi essere a conoscenza di tutti i percorsi di esecuzione dal file ob_start() al ob_get_clean().Sei sicuro che arriverà lì e che tutti i buffer aperti nel frattempo saranno stati chiusi?Tieni presente che il codice può generare eccezioni.Può essere un bug davvero divertente da rintracciare per il prossimo.

D'altra parte, e odio anche solo menzionarlo, un tempo il buffering dell'output era un po' più veloce nel concatenare stringhe di grandi dimensioni, per ragioni interne a PHP.Non sono sicuro che sia ancora vero.

Altri suggerimenti

I risultati sono gli stessi e immagino che le differenze di prestazione siano trascurabili. Fondamentalmente, una questione di preferenze di stile personale. Vorrei andare con la concatenazione da solo - utilizzo il buffering dell'output solo quando la concatenazione non è un'opzione.

Inoltre, invece di eseguire sia ob_get_contents () che ob_clean (), esegui semplicemente ob_get_clean () che esegue entrambi contemporaneamente.

Se sei preoccupato per il sovraccarico della concatenazione di stringhe, dovresti notare che:

echo '< div >'. $ test. '< / div >';

è misurabilmente più lento di questo:

echo '< div >', $ test, '< / div >';

Il primo si compila in due concatenazioni di stringhe seguite da un'eco, mentre il secondo si compila in soli tre echi, che in realtà è più veloce.

Penso che l'uso del buffering dell'output possa avere un piccolo vantaggio in termini di prestazioni quando si utilizzano stringhe di grandi dimensioni, ma per uso comune si è meglio con la concatenazione secondo me poiché questo codice sarà probabilmente più facile da capire e debug da altri.

Un piccolo punto, ma se si intende utilizzare l'approccio del buffering dell'output, è possibile utilizzarlo completamente:

ob_start();

foreach($items as $item) {
    echo '<div>';
    echo $item;
    echo '</div>';
}

$test = ob_get_clean();

Come accennato in precedenza, il buffering dell'output è migliore per le prestazioni. Per stringhe di grandi dimensioni, la differenza di prestazioni non è affatto debole. È possibile confrontare il buffering di output in PHP con StringBuffer / StringBuilder in Java; per la concatenazione di stringhe, l'intera stringa deve essere copiata ogni volta in memoria. Per il buffering dell'output, il testo viene inserito in un buffer che cresce in increme sensati e non è necessario copiare i dati per ciascun output.

Potresti anche pensare di utilizzare HTML inline (anche più veloce). Un ulteriore vantaggio dell'HTML inline è che il tuo IDE può probabilmente eseguire l'evidenziazione della sintassi sull'HTML, cosa che non accadrà quando l'HTML si trova all'interno di una stringa PHP. Codice modificato (short_open_tags = On richiesto):

ob_start();
?>

<? foreach($items as $item) { ?>
    <div><?= $item ?></div>
<? } ?>

<?
$test = ob_get_clean();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top