Генерация PHP HTML – использование объединения строк
-
05-07-2019 - |
Вопрос
Вопрос о разных методах вывода 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 или добавлять стили каким-либо другим способом, поэтому решение должно учитывать это.