Question

J'ai vu beaucoup de ob_get_clean() ces derniers temps. En général, j'ai fait $test .= 'test'

Je me demande si l'un est plus rapide et / ou meilleur que l'autre.

Voici le code utilisant <=>:

ob_start();

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

$test = ob_get_clean();

Voici le code utilisant <=>:

$test = '';

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

Quel est le meilleur?

Était-ce utile?

La solution

Les tampons de sortie contiennent tous les pièges des variables globales. Vous devez connaître tous les chemins d’exécution du ob_start() au ob_get_clean(). Etes-vous sûr que cela aboutira et que tous les tampons ouverts entre les deux auront été fermés? Gardez à l'esprit que le code peut générer des exceptions. Cela peut être un bug vraiment amusant pour le prochain gars à traquer.

D'autre part - et je déteste même le mentionner - à une certaine époque, la mise en mémoire tampon de sortie était un peu plus rapide pour concaténer de grandes chaînes, pour des raisons internes à PHP. Je ne sais pas si c'est toujours vrai.

Autres conseils

Les résultats sont les mêmes et j'imagine que les différences de performances sont négligeables, voire inexistantes. Fondamentalement, une question de préférence de style personnel. J'irais moi-même avec la concaténation. J'utilise la mise en tampon de sortie uniquement lorsque la concaténation n'est pas une option.

De plus, au lieu d'exécuter ob_get_contents () et ob_clean (), lancez simplement ob_get_clean (), qui effectue les deux à la fois.

Si la surcharge liée à la concaténation de chaînes vous préoccupe, notez que:

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

est sensiblement plus lent que cela:

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

Le premier est compilé en deux concats de chaîne suivis par un écho, tandis que le second est compilé en seulement trois échos, ce qui est en fait plus rapide.

Je pense que l'utilisation de la mise en mémoire tampon de sortie peut avoir un léger avantage en termes de performances lorsque vous utilisez des chaînes volumineuses, mais pour une utilisation courante, la concaténation est préférable, car ce code sera probablement plus facile à comprendre et à déboguer.

Un petit point, mais si vous envisagez d'utiliser l'approche de mise en mémoire tampon de sortie, vous pouvez également l'utiliser pleinement:

ob_start();

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

$test = ob_get_clean();

Comme mentionné ci-dessus, la mise en mémoire tampon de la sortie est meilleure pour les performances. Pour les grandes chaînes, la différence de performance n’est pas du tout négligeable. Vous pouvez comparer la mise en mémoire tampon de sortie dans PHP à StringBuffer / StringBuilder en Java; pour la concaténation de chaînes, la totalité de la chaîne doit être copiée en mémoire à chaque fois. Pour la mise en mémoire tampon de la sortie, le texte entre dans une mémoire tampon qui s’agrandit par incréments sensibles, et il n’est pas nécessaire de copier les données pour chaque sortie.

Vous pourriez aussi penser à utiliser du HTML incorporé (encore plus rapidement). L'avantage supplémentaire pour le HTML intégré est que votre IDE peut probablement mettre en évidence la syntaxe sur le HTML, ce qui ne se produira pas si le HTML est à l'intérieur d'une chaîne PHP. Code modifié (short_open_tags = On required):

ob_start();
?>

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

<?
$test = ob_get_clean();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top