|
|
|
| Есть ли разница между следующими двумя примерами, в плане нагрузки на сервер и времени выполнения кода?
<?php php-код ?>
html-код
<?php php-код ?>
|
<?php
php-код
вывод html-кода через echo
php-код
?>
|
Например есть html-форма, в которой некоторым атрибутам присваиваются значения переменных через echo. Как быть? Вставлять в форму несколько кусков php-кода типа
<?php echo $переменная; ?>
|
или взять всю форму в php и выводить всю форму через echo? | |
|
|
|
|
|
|
|
для: demon51085
(26.03.2011 в 13:28)
| | Можно потестировать, но вряд ли выбор того или иного подхода будет узким местом в производительности. Делайте так, как вам удобнее и читабельнее, чем быстрее вы сами будете работать, тем больше у вас будет времени поразмышлять над действительно узкими местами Web-приложения, вроде структуру базы данных.
PS Вообще преждевременная оптимизация считается в программировании большим грехом. Вы сейчас перелопатите весь код в угоду 3 миллисекунд так, что ни вам, ни другим с ним будет не удобно, а потом выяснится, что приложение тормозит совершенно в другом месте и на секунды. | |
|
|
|
|
|
|
|
для: cheops
(26.03.2011 в 13:36)
| | Мне обеими способами будет удобнее. Да и я единственный кто будет работать с этим кодом, так что здесь вопрос не в удобстве. Мне нужно знать отличие в плане производительности, даже если оно минимальное. На глаз может и не будет заметно, но зато поисковики учитывают даже милисекунды. | |
|
|
|
|
|
|
|
для: demon51085
(26.03.2011 в 13:53)
| | Это сложно измерить, так как разница эта будет лишь при первом обращении к скрипту, после того, как план его выполнения попадет в кэш, что первый, что второй скрипты будут одинаковы (так как во внутреннем представлении все превратится в echo). У вас производительность больше будет зависеть от размеров скриптов и их количества, чем от таких деталей. | |
|
|
|
|
|
|
|
для: cheops
(26.03.2011 в 14:08)
| | Но ведь одно обращение к Apache лучше чем несколько?! | |
|
|
|
|
|
|
|
для: demon51085
(26.03.2011 в 14:26)
| | А у вас и там и там будет одно обращение и Apache получит от PHP и отправит один и тот же HTML-код. Для самого PHP разница в коде будет лишь при первом обращении (на холодном сервере, только только запущенном) - потом они будут одинаковы, так как он код компилирует в некое подобие байт-кода. | |
|
|
|
|
|
|
|
для: cheops
(26.03.2011 в 14:35)
| | В первом коде я вижу 2 обращения к Apache. | |
|
|
|
|
|
|
|
для: demon51085
(26.03.2011 в 15:02)
| | Это не обращение к Apache, обращения к Apache это обращение к самому файлу. Сам Apache разбором и интерпретацией PHP-вставок не занимается, он просто отдает клиенту HTML-код в соответствии с адресом, который был запрошен. Разбором занимается PHP, делает он это один раз, формируя план выполнения, к которому потом и обращается (т.е. каждый раз скрипт не разбирается, разбор происходит только если это первое обращение после включения сервера или редактирования скрипта). | |
|
|
|
|
|
|
|
для: demon51085
(26.03.2011 в 13:28)
| | Ощутимая разница видимо только в байтах.
Есть люди с заскоками, как я например, которые экономят каждый байт, только бы пользователь поменьше грузил html кода в браузер, и используют для этого php дескрипторы.
Смотрите пример.
Есть класс, который просто отдает в браузер js код. Для отступов используются пробелы, так как мне не удобно работать с символом табуляции. Результат работы этого класса отдаст в браузер примерно ~416 байт
<?php
class js
{
static function aut()
{
?>
function aut()
{
var err='';
if(gv('login')=='')err+='Не указан логин<br />';
if(gv('password')=='')err+='Не указан пароль<br />';
if(err!='')
{
/* ... */
return false;
}
else
{
var query='&login='+gve('login')+'&password='+gve('password');
/* ... */
}
}
<?php
}
}
?>
|
Если же обработать этот код php дескрипторами, вот так, то исходный код уменьшается где то до ~266 байт
<?php
class js
{
static function aut()
{
?>function aut()<?php
?>{<?php
?>var err='';<?php
?>if(gv('login')=='')err+='Не указан логин<br />';<?php
?>if(gv('password')=='')err+='Не указан пароль<br />';<?php
?>if(err!='')<?php
?>{<?php
?>/* ... */<?php
?>return false;<?php
?>}<?php
?>else<?php
?>{<?php
?>var query='&login='+gve('login')+'&password='+gve('password');<?php
?>/* ... */<?php
?>}<?php
?>}<?php
}
}
?>
|
Кто-то скажет что я херней занимаюсь и может так оно и есть, но зато какая экономия трафика получается :) | |
|
|
|
|
|
|
|
для: deimand
(26.03.2011 в 14:24)
| | А не проще это делать конструкцией вида (или не хотите с кавычками возиться?)
<?php
$str .= "...";
$str .= "..."
?>
| PS Вообще можно наверное поэлегантнее решение найти - ведь редактировать и поддерживать такой стиль достаточно накладно по времени, да и читабельность страдает. | |
|
|
|
|
|
|
|
для: cheops
(26.03.2011 в 14:31)
| | Через echo может потребоваться экранирование кавычек, что еще хуже в отладке, а код я обратываю только тогда, когда уже все запущено, все работает, и вероятность его редактирования практически отсутствует.
Конечно геморроем выходит редактирование, но читабельность вполне приемлема. Привык уже наверное. | |
|
|
|
|
|
|
|
для: deimand
(26.03.2011 в 14:37)
| | a echo<<<HTML? | |
|
|
|
|
|
|
|
для: deimand
(26.03.2011 в 14:24)
| | Что-то я не вьехал в ваш код. Вы понапихали пустые php-блоки?! Какую роль они играют? Разве что увеличилось количество обращений к Apache. Может это каким то чудом экономит трафик, но вот время выполнения скрипта мне кажется от этого увеличивается. | |
|
|
|
|
|
|
|
для: demon51085
(26.03.2011 в 14:33)
| | К Apache будет лишь одно обращение, сам Apache отдаст все содержимое PHP-интерпретатору, получит от него готовый HTML-код и отправит его клиенту. Это лишь работа анализатору PHP-кода (даже не интерпретатору). | |
|
|
|
|
|
|
|
для: cheops
(26.03.2011 в 14:42)
| | разве каждый "<?php" это не обращение к Apache? | |
|
|
|
|
|
|
|
для: demon51085
(26.03.2011 в 14:52)
| | Обращение к Apache - это GET или POST запрос.
Если требуется просто html страничка, то до php скорее всего и дело не доходит.
Но если файл имеет расширение указанное в настройках Apache как php файл, то Apache идет к своему кенту PHP и говорит ему, что мол это по твоей части - занимайся. Чем там php будет заниматься для Apache все равно, он лишь ждет от своего кента ответа в виде заголовков и html кода, который и отдает в ответ на запрос.
Примерно так, в мельчайших подробностях не могу сказать, так как я сам занял позицию кента Apache и доверяю ему эти вопросы решать самому. | |
|
|
|
|
|
|
|
для: deimand
(26.03.2011 в 15:17)
| | Apache отдает php-интерпретатору сразу весь php-файл или частями (только php-блоки)? | |
|
|
|
|
|
|
|
для: demon51085
(26.03.2011 в 15:39)
| | Сразу весь файл. | |
|
|
|
|
|
|
|
для: deimand
(26.03.2011 в 14:24)
| | Вы просто взяли пробелы в php блоки, чтоб они не отправились браузеру?! Помоему это глупо. Лучше уж убрать пробелы, читабельность будет не хуже чем с этим мусором. | |
|
|
|
|
|
|
|
для: demon51085
(26.03.2011 в 14:46)
| | Кому как удобнее, я же не настаиваю.
Но когда много вложенных условий, т.е. фигурных скобочек, читать код очень тяжело без пробелов (без отступов). | |
|
|
|
|
|
|
|
для: deimand
(26.03.2011 в 14:54)
| | Ясно. Но меня волнует не трафик, а время выполнения скрипта. | |
|
|
|
|
|
|
|
для: deimand
(26.03.2011 в 14:24)
| |
<?php
class js
{
static function aut()
{
?>
function aut()
{
....
....
/* ... */
}
}
<?php
}
}
?>
|
В вашем случае java-скрипт выносится в отдельный файл и перед публикацией на сервере сжимается. Отлаживать вы его можете в каком угодно виде.
Естественно этот вариант я считаю идеальным :) - мало кто придерживается такого. | |
|
|
|
|
|
|
|
для: demon51085
(26.03.2011 в 13:28)
| | >Например есть html-форма, в которой некоторым атрибутам присваиваются значения переменных через echo. Как быть? Вставлять в форму несколько кусков php-кода типа
>
<?php echo $переменная; ?>
|
>или взять всю форму в php и выводить всю форму через echo?
По поводу вставки конструкций echo в код вам уже ответили. Лично мое мнение - на производительность скрипта это практически никак не влияет.
Для проверки можете выполнить такой скрипт:
<?php
$t = microtime(true);
for($i=0;$i<=100000;$i++){
echo "TEST ";
}
$ts = sprintf(" %.4f seconds", microtime(true) - $t);
echo "<br>time execute script: " . $ts;
?>
|
потом замените
на
да, вариант 2 выполняется немного быстрее (примерно на 1 сотую секунды), заметьте 1 сотая секунды на 100000 выводов. Я думаю это не существенно.
Но практическая применимость варианта два отсутствует.
Я уже давно для своих проектов использую принцип отделения кода от HTML шаблона страницы. То есть код на PHP сначала формирует переменные (из БД либо обсчитывает их), которые затем передаются шаблонизатору, который в свою очерендь вставляет их в определенные места страницы (шаблона).
В этом случае код выглядит абсолютно чисто - практически никаких HTML конструкций в нем нет.
И да - для вывода переменных вам все равно придется использовать конструкцию echo.Так или иначе она используется всегда, так как другого варианта вывода переменных просто нет. Даже при отделении кода скрипта от шаблона - шаблонизатор формирует эти конструкции для каждой переменной. | |
|
|
|