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






Обычно я использую метод №1, поэтому я могу поместить этот HTML в любое место файла шаблона, содержащего статический HTML. Я стараюсь держать как можно больше HMTL в моем PHP. Это делает PHP намного чище и короче, поскольку шаблон обычно представляет собой отдельный файл.
Что касается скорости / производительности, я думаю, что разница будет очень незначительной. С буферизацией вывода она также постоянно увеличивает переменную, хотя эта переменная недоступна, но ее нужно где-то хранить.
Я часто задавался вопросом, работает ли открытие и закрытие <?php медленнее, чем просто поместить все это в <?php и затем повторить все сразу.
Я думаю, что в конце концов мы говорим о миллисекундах в чрезвычайно сложных сценариях.
Ах да, метод №1 намного более гибкий, поскольку вы можете использовать echo $html; где угодно.
Это правда, что постоянное изменение переменной и ее повторная печать сопряжены с небольшими накладными расходами. Однако выполнение нет означает, что в какой-то момент скрипт может завершить работу (из-за прерывания или подобного), и последовательные операторы эха будут частично печатать страницу, а не ничего.
Я собирался напечатать длинный ответ о том, что строки 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 [] w / join vs $ output. =
Объединение строк - самый быстрый способ построения строк.
Я не тестировал "эхо" и построение строк, но пока вы не используете буферизованный вывод, эхо должно быть самым быстрым из-за последовательной записи в самопромывающийся буфер. (только замедление при сбросе, чего вы действительно не избежите, даже если заранее выполните конкатенацию строк)
Помимо самой идеи конкатенации строк, вы действительно спрашиваете (я думаю), как вы должны создавать веб-страницы, и меня поражает, что любая форма явной конкатенации, вероятно, является неправильным поступком.
Попробуйте использовать Модель-представление-элемент управления для создания ваших данных и передать их в простую библиотеку шаблонов (например, Умный), и пусть он позаботится о том, как построить ваше представление.
Лучшее разделение, меньше забот.
Что-то, о чем я не упоминал, - это то, что обычно специалист по PHP должен работать с дизайнерами, которым нужно классифицировать HTML или добавлять стили каким-либо другим способом, поэтому решение должно учитывать это.
Это немного устарело, но, вероятно, поможет эта почта от Сары Големон. AFAIK функции буферизации вывода довольно быстрые и эффективные, как и echo, так что это то, что я бы использовал.