Генерация 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>';

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
4
0
5 875
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

Обычно я использую метод №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, так что это то, что я бы использовал.

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