È meglio usare ob_get_contents() o $text .= 'test';
-
08-07-2019 - |
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?
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();