Вопрос

Я видел много ob_get_clean() последнего времени. Обычно я сделал $test .= 'test'

Мне интересно, быстрее ли один и / или лучше другого.

Вот код, использующий <=>:

ob_start();

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

$test = ob_get_clean();

Вот код, использующий <=>:

$test = '';

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

Что лучше?

Это было полезно?

Решение

Выходные буферы имеют все подводные камни глобальных переменных. Вы должны знать все пути выполнения от ob_start() до ob_get_clean(). Вы уверены, что он туда попадет, и что любые буферы, открытые между ними, будут закрыты? Имейте в виду, что код может генерировать исключения. Это может быть действительно забавной ошибкой для следующего парня, который выследит.

С другой стороны - и я не хочу даже упоминать об этом - когда-то буферизация вывода была несколько быстрее при конкатенации больших строк по причинам, внутренним по отношению к PHP. Я не уверен, правда ли это.

Другие советы

Результаты одинаковы, и я думаю, что различия в производительности незначительны, если таковые имеются. В основном, вопрос личных предпочтений стиля. Я бы пошел с конкатенацией сам - я использую буферизацию вывода, только когда конкатенация не вариант.

Кроме того, вместо запуска ob_get_contents () и ob_clean () просто запустите ob_get_clean (), который выполняет оба сразу.

Если вы обеспокоены накладными расходами на конкатенацию строк, обратите внимание, что это:

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

заметно медленнее, чем это:

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

Первый компилируется до двух конкатов строк, за которыми следует эхо, а второй - до трех эхо, что на самом деле быстрее.

Я думаю, что использование буферизации вывода может дать небольшой выигрыш в производительности, когда вы используете массивные строки, но, на мой взгляд, вам лучше использовать конкатенацию, так как этот код, вероятно, будет проще для понимания и отладки другими.

Небольшое замечание, но если вы собираетесь использовать подход буферизации вывода, вы можете также использовать его полностью:

ob_start();

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

$test = ob_get_clean();

Как упоминалось выше, выходная буферизация лучше для производительности. Для больших строк разница в производительности не является ничтожной. Вы можете сравнить выходную буферизацию в PHP с StringBuffer / StringBuilder в Java; для конкатенации строк необходимо каждый раз копировать всю строку в память. Для буферизации вывода текст помещается в буфер, который увеличивается с заметным приращением, и нет необходимости копировать данные для каждого вывода.

Вы также можете подумать об использовании встроенного HTML (даже быстрее). Дополнительным преимуществом встроенного HTML является то, что ваша IDE может выполнять подсветку синтаксиса HTML, что не произойдет, если HTML находится внутри строки PHP. Измененный код (short_open_tags = On обязательно):

ob_start();
?>

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

<?
$test = ob_get_clean();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top