Вопрос к php-профессионалам

  • Автор темы AlexSBT
  • 103
  • Обновлено
  • 18, May 2024
  • #1
Итак, я всегда думал, что когда дело касается php, лучше иметь только один открывающий тег и один закрывающий тег. Поэтому я всегда думал, что это идеально:
 <?php if($something){?>
<p>Hello World.</p>
<?php }?>
Код (разметка): Однако я читал, что HTML на php лучше не отправлять. Вроде это объяснено здесь

. Итак, это лучший способ:

 <?php if($something){ echo '<p>Hello World.</p>'; } ?>
Код (разметка): Мой вопрос: будет ли второй пример работать медленнее, если в скрипте есть ДЕСЯТКИ закрытия и открытия тегов? Действительно ли второй пример лучше? Лично я в этом сомневаюсь, но хотелось бы узнать, что думают разработчики PHP.

AlexSBT


Рег
07 Dec, 2013

Тем
1

Постов
1

Баллов
11
  • 18, May 2024
  • #2
...и мы должны верить, что эти шутники имеют какое-то дело говорить нам, как создавать шаблоны?!? БРЕД СИВОЙ КОБЫЛЫ!

Ради бога, что плохого в том, чтобы просто использовать PHP для всей этой ерунды, на которую они тратят код, память и время обработки?!? Я имею в виду, кроме их жалких примеров мошенников, сложенных карточками?



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



Мило, если вы строите только собственными силами с полным контролем и практически бесполезно в коммерческом проекте.
 

seilordead


Рег
21 Feb, 2012

Тем
0

Постов
2

Баллов
2
  • 18, May 2024
  • #3
Так что дело не столько в скорости, сколько в читаемости и обслуживании. У меня был сценарий, длинный, когда я его переписал (в нем было, наверное, 100 тегов запуска и остановки). Клянусь, теперь он работает быстрее, примерно на секунду.
 

Absolov Te


Рег
14 Dec, 2014

Тем
1

Постов
4

Баллов
14
  • 19, May 2024
  • #4
@JEET, но что, если существует тысяча (вполне возможно в некоторых скриптах) тегов запуска и остановки, тогда PHP придется отправлять их в браузер тысячи раз.

Как я уже упоминал выше, я очистил один скрипт (убрал лишние теги запуска/остановки), и он, кажется, работает быстрее, но опять же, мне не с чем его сравнивать, поскольку у меня больше нет старой версии.

@deathshadow Я почти никогда не использую двойные кавычки в эхо или фигурных скобках, если только не использовать их абсолютно невозможно.

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

Пока что кажется, что существуют две противоположные точки зрения.

Читая ваши посты, я понимаю, что множество открывающих/закрывающих тегов — это ерунда. @phpmillion Один из купленных мной сайтов работает с использованием шаблонов PHP, и, честно говоря, я не большой поклонник такого подхода.

Вполне возможно, что это из-за дизайна сайта.
 

mrosd


Рег
10 May, 2014

Тем
0

Постов
2

Баллов
2
  • 20, May 2024
  • #5
Существует компонент скорости, но он влияет на сложность того, как вы открываете/закрываете. Подход к строкам с двойными кавычками или подход с фигурными скобками является самым медленным, поскольку они требуют большей обработки строк.

В частности, они полагаются на обработку строк при КАЖДОМ вызове, поэтому:
 

function template_header() {

echo '<!DOCTYPE html><html lang="',

Settings::value('contentLang'),

'"><head><meta charset="',

Settings::value('encoding'), '">

<base href="', BASE_HTTP, '">';

if ($temp = Settings::section('namedContentMeta'))

foreach ($temp as $name => $content) {

echo '

<meta';

if (is_array($content)) template_header_attrPairs($content);

else echo ' content="', $контент,'"';

echo '>';

}

Код (разметка): пример, приведенный @sarahk, будет самым медленным, поскольку в нем используются ОБА скобки И двойные кавычки. ЭТО безобразие и тому подобное:
  if ($something) echo ' <p>Hello World.</p>'; 
Код (разметка): Или это «правильный» способ сделать это, если вы собираетесь поневоле открывать/закрывать PHP без уважительной причины:
 foreach($totals as $k => $v) echo ' <tr> <td>', $k, '</td> <td>', $v, '</td> </tr>'; 
Код (разметка): Было бы быстрее.

НО вот так:
  <?php foreach ($totals as $k => $v): ?> <tr> <td><?= $k; ?></td> <td><?= $v; ?></td> </tr> <?php endforeach; ?> 




Код (разметка): Фактически, последний из них самый быстрый и чистый, потому что есть только одна реальная команда echo, а затем вывод с разделителями, с использованием простых строк в одинарных кавычках! Кроме того, из-за меньшего количества кода он анализируется быстрее, если подпрограмма не находится в кеше байт-кода, статические строки разделяются на область данных, что приводит к лучшему использованию памяти, а также к меньшему байт-коду, увеличивающему вероятность того, что он останется в кэше.



кэш.

Ссылка на stackExchange, которой вы поделились, наполнена только плохими практиками и примерами стопок карт.

Для меня постоянное открытие и закрытие PHP — это просто пустая трата набора текста, ухудшающая ясность, И это не быстрее — обычно медленнее — чем просто использование строк в одинарных кавычках с разделителями-запятыми в echo.

вот почему ИМХО строки с двойными кавычками со встроенными переменными И короткие теги PHP должны быть полностью удалены из PHP - чтобы PHP мог вести себя больше как настоящий язык программирования, а не как наполовину скриптовый язык.

Следовательно, если бы я писал ваш оригинальный пример, я бы не тратил время на скобки НИЧЕГО.

Если вы выполняете только одну команду, просто сделайте это!
  <?php foreach($totals as $k => $v) { ?> <tr> <td><?php echo $k; ?></td> <td><?php echo $v; ?></td> </tr> <?php } ?> 
Код (разметка): Поддержание только одного вообще.

Также дает вам возможность форматировать выходные данные, что упрощает отладку выходных данных.

Хорошее эмпирическое правило: если вы видите реальную выгоду от удаления/минимизации пробелов в HTML (кроме полезных напоминаний о том, что НЕ следует вставлять что-либо между определенными тегами), значит, с HTML что-то НЕПРАВИЛЬНО.

Вот почему, если вы покопаетесь в одном из моих файлов шаблонов, вы обнаружите что-то вроде этого:

  foreach($totals as $k => $v){ echo " <tr> <td>{$k}</td> <td>{$v}</td> </tr>"; } 
Код (разметка): написание такого кода с бесконечными заставило бы меня выколоть себе глаза. редактировать -- Чертово саке, которое выглядит как дерьмо с цветовой подсветкой синтаксиса. ВОТ почему я ненавижу эту неразборчивую, сложную в употреблении чушь!
 

Boroda1


Рег
24 Mar, 2013

Тем
0

Постов
2

Баллов
2
  • 21, May 2024
  • #6
НА САМОМ ДЕЛЕ я исправляюсь.

В PHP 5.x/более ранних версий версия с двойными кавычками со встроенными строками работает медленнее, но они, похоже, оптимизировали ее для PHP 7 - использование памяти все еще выше, но теперь на самом деле БЫСТРЕЕ делать это «тупым» способом с точки зрения время исполнения.

Итак, теперь все сводится к чистоте кода и тому, насколько важен для вас объем памяти, поскольку чрезмерное использование памяти во многих запросах все равно может снизить вашу скорость, даже если на бумаге время выполнения быстрее.

РАДОСТЬ. Должно быть, они сейчас обрабатывают это на уровне синтаксического анализатора, а не на уровне выполнения.

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

DaXaT


Рег
17 Dec, 2015

Тем
0

Постов
2

Баллов
2
  • 21, May 2024
  • #7
В общем, я не думаю, что вы заметите какие-либо различия в скорости при любом выбранном вами методе, это больше зависит от читаемости кода и упрощения его обслуживания. Мол, в целом проще разделить код, но если вам просто нужно вставить одну строку, возможно, лучше просто использовать эхо для этого единственного экземпляра, а не открывать и закрывать теги PHP только для этой одной строки; но если у вас большие куски HTML, то проще закрыть и снова открыть PHP, чем использовать кучу эхо-операторов.



Однако стоит обратить внимание на PHP «HEREDOCS» и «NOWDOCS»; оба они позволяют выводить контент немного чище, чем с помощью набора операторов echo, и не требуют экранирования при использовании внутри них кавычек; разница в том, что синтаксический анализ выполняется внутри HEREDOCS, что означает, что вы можете использовать переменные внутри них, как в двойных кавычках, а с NOWDOCS они ведут себя как строки в одинарных кавычках, синтаксический анализ не выполняется.

Дополнительная информация и ошибки здесь: http://php.net/manual/en/language.types.string.php

Наконец, я не рекомендую это сейчас, но как только вы приобретете немного больше опыта работы с PHP, я бы порекомендовал прочитать методологию MVC; по сути, это более чистый способ разделения вашего кода.
 

baz1


Рег
10 Feb, 2015

Тем
0

Постов
2

Баллов
2
  • 21, May 2024
  • #8
Таким образом, вы можете ясно видеть, что в строке есть переменная, без необходимости просматривать ее целиком, потому что строка в двойных кавычках может содержать переменную; и, кроме того, PHP анализирует только то, что ему нужно.
 

0071


Рег
17 Oct, 2015

Тем
0

Постов
1

Баллов
1
  • 28, May 2024
  • #9
Да, все знают, что вы единственный настоящий программист на планете, а все остальные (пусть это будут начинающие программисты или разработчики, отвечающие за кодирование/оптимизацию для крупнейших компаний мира), которые используют любой тип библиотеки, - придурки, неудачники и неудачники.

идиоты (или, по крайней мере, ленивые ублюдки).
 

McLaren1


Рег
06 Apr, 2012

Тем
0

Постов
2

Баллов
2
  • 31, May 2024
  • #10
@JEET, все это добавление строк в первом случае просто тратит ОГРОМНЫЕ объемы памяти, тем более, если включено сжатие gzip, при котором весь вывод все равно буферизуется.

Этот первый пример — на самом деле никогда не следует писать код таким образом.

Это также уродливый способ справиться с этим.
 

<?php

$title='Заголовок страницы';

$beforeCall='<p> This is some html </p>';

$api= getAPIData();

$after='<p> This is more data </p>';

echo '<html><head><title>', $title, '</title></head><body>

', $before, '

', $api, '

', $after, '

</body></html>';





Код (разметка): если предположить, что все эти «бесполезные переменные» являются заполнителями для данных, извлеченных из баз данных, но даже в этом случае это МОЖЕТ быть немного расточительно и неэффективно со стороны памяти, обрабатывающей всю обработку в первую очередь, хотя она МОЖЕТ выполняться быстрее, поэтому вы можете приходится сопоставлять доступную память и влияние нескольких запросов, занимающих большую площадь, со скоростью выполнения.

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

МНОГО раз вы можете ускорить процесс, увеличив объем оперативной памяти, или обмануть себя, думая, что он работает быстрее в автономном режиме в среде тестирования с низкой нагрузкой, а затем сидеть и чесать голову, задаваясь вопросом, почему все идет не так.

вниз на сервере с реальным трафиком.

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

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

Мое отделение вывода от данных по-прежнему означает, что обработчик данных как минимум ВЫЗЫВАЕТ шаблон, когда он готов.

У меня могут быть некоторые меньшие значения - заголовок, привязки меню, текст и т. д. и т. п. - сохраненные заранее, но область содержимого? Не так много.
 

Виктор4


Рег
27 Feb, 2013

Тем
1

Постов
2

Баллов
12
  • 01, Jun 2024
  • #11
Если вы заботитесь о читабельности и обслуживании, лучший подход — вообще не использовать спагетти-код.

То есть рассмотрите возможность использования механизма шаблонов PHP, который упрощает обслуживание и обновление.

Конечно, переход со спагетти на движок шаблонов может занять некоторое время (зависит от текущего кода вашего скрипта и его размера), но позже это сэкономит вам много времени. Лично мне нравится Twig, потому что его очень легко освоить и использовать.
 

Ksenia882


Рег
01 Jan, 2011

Тем
1

Постов
3

Баллов
13
  • 01, Jun 2024
  • #12
Когда я только начинал, я где-то прочитал, что второй метод лучше.

Тот, у которого есть несколько открывающих и закрывающих тегов.

В статье сказано, что таким образом время загрузки страницы значительно ускоряется.

Потому что когда мы запускаем один тег в начале и закрываем его в самом конце,

затем php сохраняет выходные данные и не отправляет их в браузер до тех пор, пока вся обработка не будет завершена.

Однако, когда теги открываются и закрываются снова и снова,

тогда PHP продолжает отправлять выходные данные в браузер, как только тег закрывается...

Попробуйте эти 2 кода на вашем локальном хосте

Увеличьте лимит в долларах США, если вам нужно...

$лимит= 100000;

for($x=0; $x<$limit; ++$x){ echo "мое имя "; } ?> --- второй способ $лимит= 100000; for($x=0; $x<$limit; ++$x){ ?> мое имя } ?>
 

igor_xp


Рег
17 Jun, 2013

Тем
1

Постов
2

Баллов
12
  • 01, Jun 2024
  • #13
Ваш сайт в любом случае должен использовать MVC, что означает любую логику в Вiew довольно легкий. Системы шаблонов были предшественниками тех дней, когда мы осознали, что нам нужно разделить контент, но не совсем знали, как это сделать.
 

Sergio Valentino


Рег
23 May, 2013

Тем
1

Постов
3

Баллов
13
  • 01, Jun 2024
  • #14
Нет, скрипттардеры — это почти исключительно «JavaScript, не имеющий никакой ценности». Это просто случайное открытие PHP только для того, чтобы усложнить отслеживание кода и предотвратить сохранение статических строк из-за странностей в том, как парсер обрабатывает это.

Никогда не мог придумать для него милого названия.

Я просто считаю, что это уродливо и сложнее в обслуживании по сравнению с echo со строками в одинарных кавычках и разделителями-запятыми.
 

VIcont1


Рег
31 Aug, 2011

Тем
1

Постов
4

Баллов
14
  • 04, Jun 2024
  • #15
qwikad Меня тоже очень раздражают многочисленные открывающие и закрывающие теги.

Вот почему я тоже использую подход с одним тегом, но в прошлом я видел, как это происходило в реальном времени.

Один из моих сценариев выполнял вызов API Yahoo, и этот вызов занимал время.

При использовании одного тега в браузер ничего не отправлялось до завершения всей обработки.

Затем я переключил этот скрипт на использование нескольких тегов, как показано ниже.

Все данные до вызова API отображались в браузере, а затем, когда вызов API был выполнен, поступили остальные.

То есть посетитель не стал ждать, глядя на пустую страницу...

По сути, время отклика веб-сайта значительно улучшилось.

Также я обнаружил, что использование подхода с несколькими соединениями MySQL происходит быстрее, чем подход с одним соединением.

Как и раньше, я подключался к базе данных сверху и закрывал БД в конце.

Позже я обнаружил, что подключение к БД только тогда, когда вам нужно отправить запрос, улучшает общее время ответа сайта...

С тех пор я отправляю запросы через функцию.

Функция подключается к БД, выполняет запрос, закрывает БД и возвращает массив вывода в переменную...

Единый подход был таким:

 <?php

$title='Это заголовок страницы';

?>

<html><head><title><?php echo $title; ?></title></head><body>

<?php

$before='This is before API';

?>

<p> Some basic designing etc

<?php echo $before; ?>

<p> Other html

<?php

$api=getApiData();

echo $api;

?>

<p> Other html

<?php

$after='This is data after API';

echo $after;

?>

</body></html>
PHP: подход с использованием нескольких тегов был таким:
 <?php $title='Заголовок страницы'; $beforeCall='<p> This is some html </p>'; $api= getAPIData(); $after='<p> This is more data </p>'; $html='<html><head><title>'. $title.


'</title></head><body> '. $before.

' '. $api.

' '. $after.

' </body></html>'; echo $html; ?>
PHP: Все данные до вызова API отображались в браузере без каких-либо задержек. Конечно, структура HTML была основана на DIV, а не на TABLE.
 

Morido


Рег
12 Jan, 2015

Тем
1

Постов
3

Баллов
13
  • 04, Jun 2024
  • #16
WordPress постоянно переключается на PHP и выходит из него, и насколько я знаю, @deathshadow описывает это как скриптерию или что-то в этом роде. Я нахожу его менее читабельным и склонен ошибаться в плане читабельности и удобства обслуживания.

Вычислительная мощность серверов по сравнению с дополнительными нагрузками означает, что ваш скрипт не будет медленнее. Лучшим примером может быть
 foreach($totals as $k => $v){
echo "<tr><td>{$k}</td><td>{$v}</td></tr>";
}
PHP: против
 foreach($totals as $k => $v){ <tr> <td><?php echo $k</td> <td><?php echo $v; ?></td> </tr> }
PHP: Будет время использовать оба подхода, и от другого кода вокруг него будет зависеть, какой из них будет наиболее читабельным, когда вам придется вернуться и внести изменения.
 

sxqzqws


Рег
21 Oct, 2012

Тем
0

Постов
3

Баллов
3
  • 07, Jun 2024
  • #17
(и это хороший момент) между heredoc/nowdoc и обычными строками нет НУЛЕВЫХ законных различий - за исключением того, что, ИМХО, с ними ТРУДНЕЕ работать.

Но мне часто кажется, что я смотрю на то, как использовать строки в PHP иначе, чем на других, поскольку я утруждаюсь использованием разделителей-запятых в своих эхо.

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

Как будто они ХОТЯТ, чтобы строки в кавычках были отстойными, поэтому они делают все возможное, чтобы это сделать.
 

jakella


Рег
20 Oct, 2012

Тем
0

Постов
3

Баллов
3
  • 09, Jun 2024
  • #18
О, еще несколько деталей, о которых следует знать: ГОЛОВНЫЕ БОЛИ, не разделяющие запятую, и использование двойных кавычек могут создать порядок выполнения.

Я скорее увижу, как вы используете бесконечные бессмысленные , чем строки в двойных кавычках с переменными внутри них! - и я ВСЕГДА говорю: «не открывайте/закрывайте PHP просто так». БОЛЬШЕ с точки зрения разделения запятых и добавления строк.

Избегайте добавления строк, если только вам НЕ НУЖНО использовать их, например, внутри тернарного оператора.

Если вы можете использовать эхо, разделенное запятыми (или волей-неволей php открывается/закрывается), сделайте это. Чешский это:
 
echo '<tr><td>', $k, '</td><td>', $v, '</td></tr>';
Код (разметка): поскольку функция сложения строк должна запускаться ДО того, как произойдет добавление, для генерации результата внутри зарезервировано больше памяти, а эхо внутри функции запускается ДО того, как строка будет построена.

Таким образом, вывод из приведенного выше фрагмента:
  echo "<tr><td>{$k}</td><td>{$v}</td></tr>"; 
Код (разметка): Часто смешно, как часто люди это портят, особенно в turdpress, поскольку он ВСЕ время использует функцию с эхом/выводом вместо метода результата.

Вы используете разделители-запятые или , по крайней мере, они будут выполняться в том порядке, в котором вы ожидаете!



Таким образом, я думаю, что чрезмерное использование строк в двойных кавычках и сложение строк, когда они оба ГРОМКО ВЫсасывают ясность и производительность кода, - вот откуда взялся МИФ об «использовании вместо echo». Вы избегаете строк с двойными кавычками, за исключением тех случаев, когда они вам нужны, и ваше эхо разделяется запятой, это быстрее, требует меньше памяти, и это просто здорово!

Вроде того, как люди, которые думают, что «вы не можете использовать переменные функции с языковыми конструкциями, такими как echo», означают, что вы не можете этого сделать:

  <a href='whatever' style='color:red'> 
Код (разметка): Что совсем не то, что означает документация.

Это означает, что вы не можете сделать это:
  $test = 'echo'; $test('this is test'); 




Код (разметка): Точно так же, как тупые тупицы, дышащие ртом, со стороны HTML, которые превратили «используйте EM и STRONG, когда их семантическое значение более уместно» в «никогда не используйте B и I» или «B и I устарели» - - или «не использовать таблицы для разметки» на «никогда не использовать таблицы». НЕ то, о чем говорила эта чертова спецификация или кто-то, кто разбирается в семантике!!!

Итог: избегайте использования двойных кавычек и сложения строк, с эхом нет ничего плохого.

Если сравнивать его с короткими тегами PHP, то он на волосок лучше.

Вы сравниваете строки в двойных кавычках, встроенные переменные, heredoc, nowdoc и всю эту раздутую дурацкую чушь с короткими тегами PHP, и все, что вы делаете, — это складываете колоду против echo с помощью дрянных методов кодирования.



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



Я понимаю:
  echo $test(); 
Код (разметка): Я автоматически предполагаю, что что-то не так с методологией серверного кода! Ну и встроенный стиль также заставляет меня думать, что они также не способны писать HTML. Вот почему мне это:
  testThis is a <br> This is a test<br> 
Код (разметка): возможно, это САМЫЙ ТУПОЙ способ обработки эха с переменными в разметке! По крайней мере по сравнению с:
  function test() { echo 'test'; } echo 'This is a ' . test() . '<br>'; // this one's jacked echo 'This is a ', test(), '<br>'; // this runs as you'd expect. 
Код (разметка): когда строки в одинарных кавычках анализируются быстрее, отправляются в очередь на эхо из статических ссылок вместо выделения большего количества памяти, ясность, которую обеспечивает форматирование пробелов, и т. д., и т. д., и т. п.
 

Vetka


Рег
12 Dec, 2010

Тем
29

Постов
217

Баллов
507
Тем
49554
Комментарии
57426
Опыт
552966

Интересно