Генерация PHP HTML - с использованием конкатенации строк - PullRequest
4 голосов
/ 07 октября 2008

Вопрос о разных способах вывода 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, но я не хочу отвечать об архитектуре - этот вопрос касается производительности. Похоже, что существуют разные мнения / тесты о том, какой из них быстрее, поэтому пока нет единого ответа.

Ответы [ 8 ]

5 голосов
/ 07 октября 2008

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

Попробуйте использовать шаблон Model-View-Control для создания ваших данных и передачи их в простую библиотеку шаблонов (например, Smarty ), и пусть она беспокоится о том, как построить свой взгляд.

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

2 голосов
/ 07 января 2009

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

2 голосов
/ 07 октября 2008

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

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

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

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

О да, метод № 1 гораздо более гибок, чем вы можете echo $html; где угодно.

1 голос
/ 07 октября 2008

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

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

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

1 голос
/ 07 октября 2008

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

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

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

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

1 голос
/ 07 октября 2008

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

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

$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 голос
/ 07 октября 2008

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

0 голосов
/ 07 октября 2008

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

...