Генерация PHP HTML - с использованием конкатенации строк

Вопрос про разные способы вывода 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>';

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

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

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


person realcals    schedule 06.10.2008    source источник


Ответы (8)


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

person too much php    schedule 07.01.2009

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

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

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

person GaryF    schedule 06.10.2008

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

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

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

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

Ах да, метод №1 гораздо более гибкий, так как вы можете echo $html; использовать его где угодно.

person Darryl Hein    schedule 06.10.2008

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

person warren    schedule 06.10.2008

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

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

$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);
person Erik van Brakel    schedule 06.10.2008

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

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

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

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

person Paul Wicks    schedule 06.10.2008

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

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

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

person Kent Fredric    schedule 06.10.2008

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

person Adriano Varoli Piazza    schedule 07.10.2008