Генерация PHP HTML – использование объединения строк

StackOverflow https://stackoverflow.com/questions/176411

Вопрос

Вопрос о разных методах вывода html из PHP;каковы различия в производительности между ними:

Способ 1 — объединение переменных

$html = '';
$html .= '<ul>';
for ($k = 1; $k < = 1000; $k++){
    $html .= '<li> This is list item #'.$k.'</li>';
}
$html .= '</ul>';
echo $html;

Способ 2 — буферизация вывода

ob_start();
echo '<ul>';
for ($k = 1; $k < = 1000; $k++){
    echo '<li> This is list item #',$k,'</li>';
}
echo '</ul>';

Я подозреваю, что постоянное изменение и увеличение переменной снижает производительность;это верно?

Ваше здоровье!

Спасибо, GaryF, но мне не нужен ответ об архитектуре — этот вопрос о производительности.Кажется, существуют разные мнения/тесты относительно того, какой из них быстрее, поэтому пока нет принятого ответа.

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

Решение

Это немного устарело, но эта почта Сара Големон, вероятно, поможет.AFAIK, функции буферизации вывода довольно быстрые и эффективные, как и echo, вот что я бы использовал.

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

Если отбросить саму идею конкатенации строк, вы действительно спрашиваете (я думаю), как вам следует создавать веб-страницы, и мне кажется, что любая форма явной конкатенации, вероятно, неправильна.

Попробуйте использовать Шаблон Модель-Представление-Управление для создания ваших данных и передачи их в простую библиотеку шаблонов (например, Умник), и пусть он позаботится о том, как построить ваше представление.

Лучшее разделение, меньше забот.

Обычно я использую метод №1, чтобы можно было поместить этот HTML-код в любое место файла шаблона, содержащего статический HTML-код.Я стараюсь избегать использования HMTL в своем PHP.Это делает PHP намного чище и короче, поскольку шаблон обычно представляет собой отдельный файл.

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

Я часто задавался вопросом, открываются и закрываются <?php это медленнее, чем просто положить все это внутрь <?php а затем повторяется одновременно.

Я думаю, что в конечном итоге мы говорим о миллисекундах в чрезвычайно сложных сценариях.

О да, метод №1 гораздо более гибкий, насколько это возможно. echo $html; в любом месте.

Это правда, что постоянное изменение переменной и ее перепечатка сопряжены с небольшими издержками.Однако, нет это означает, что в какой-то момент сценарий может завершить работу (из-за прерывания или чего-то подобного), и последовательные операторы echo частично напечатают страницу, а не ничего.

Я собирался напечатать длинный ответ о том, что строки PHP являются изменяемыми (в отличие от неизменяемых строк, как в C или C#), но думаю, что просто дам ссылку на более старый пост, который я наткнулся.В основном я занимаюсь тем, о чем вы спрашиваете, в отношении решения Java и C# с использованием построителя строк.

Примечание:решение для построителя строк будет похоже на (непроверенное):

$html = array();
$html[] = '<ul>';
for ($k = 1; $k < = 1000; $k++){
    $html[] = '<li> This is list item #';
    $html[] = $k;
    $html[] = '</li>';
}
$html[] = '</ul>';
echo implode('',$html);

Просто пара мыслей:

  • Буферизация вывода может привести к тому, что ваши страницы будут выглядеть медленными, поскольку пользователь ничего не увидит, пока не запустится весь скрипт (хотя способ настройки № 1 будет справедливым).

  • Строки в PHP изменяемы, поэтому конкатенация не так плоха, как в некоторых других языках.При этом буферизация вывода может быть немного быстрее, поскольку пространство, выделенное для ввода, по умолчанию довольно велико (40 КБ в соответствии с этот)

В конце концов, я бы сказал, что это скорее вопрос стиля.Если вам нравится то, что дает вам буферизация вывода, то, вероятно, это то, что вам нужно.

Ответы на ваш вопрос также можно найти здесь: php:вывод[] с объединением против $output .=

Конкатенация строк — самый быстрый способ создания строк.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top