Forums / National / Russian / Шаблонизатор

<<<1234>>>

Sergeich
#16 2009-03-09 08:16
Хорошо, бум пробовать, но слегонца пугают меня непрограмёра такие конструкции :)
dervan
#17 2009-03-09 08:30
# medar : Да, я тоже хотел сделать ссылкой, но меня насторожил код ниже:
case 'GLOBALS':
// Stop Recursion
break;
Наверное он там не просто так.
...
Это ссылка в $GLOBALS на самого себя - она там ещё с PHP3, когда ещё в языке ссылки не поддерживались. Проверка - чтобы не зацикливаться при копировании.

Про этот хак в XTemplate подробно рассказано здесь.
Dayver
#18 2009-03-09 08:42
Афигенно.... если все работает, и без глюков да еще и без тормозов то на днях таки активизирую свою работу по устранению xhtml кода из админских php файлов(если данная фича будет закомичена в транк).....а как покончу с админкой(почти половину уже осилил) и дефолтными плугами(а там остался всего то один плуг поиска) возьмусь за остальные части папочки systems
Pavlo Tkachenko aka Dayver
medar
#19 2009-03-09 15:35
Проапдейтил файл с учетом изменений от dervan.

Бенчмарк на локалхосте, php под виндой.

ab -c 4 -n1000 "http://localhost/svn.cotonti.com/trunk/page.php?id=2"

Новый xtemplate, два логических блока в tpl.
Requests per second: 8.48 [#/sec] (mean)
Time per request: 471.563 [ms] (mean)
Time per request: 117.891 [ms] (mean, across all concurrent requests)
Transfer rate: 64.49 [Kbytes/sec] received

Новый xtemplate, без логических блоков.
Requests per second: 8.81 [#/sec] (mean)
Time per request: 454.188 [ms] (mean)
Time per request: 113.547 [ms] (mean, across all concurrent requests)
Transfer rate: 66.25 [Kbytes/sec] received

Разницы практически нет, ок.

Теперь старый xtemplate
Requests per second: 13.06 [#/sec] (mean)
Time per request: 306.188 [ms] (mean)
Time per request: 76.547 [ms] (mean, across all concurrent requests)
Transfer rate: 99.96 [Kbytes/sec] received

Результат, мягко говоря, обескураживает. Старый более чем в полтора раза быстрее.
Начал разбираться в чем дело.

Новый xtemplate, но со старой функцией scan_globals() (без хака dervan)
Requests per second: 9.41 [#/sec] (mean)
Time per request: 424.875 [ms] (mean)
Time per request: 106.219 [ms] (mean, across all concurrent requests)
Transfer rate: 70.83 [Kbytes/sec] received

Кто-нибудь может прокомментировать, что происходит ? :) Как-то это всё нелогично..

Надо проштудировать хабр, вроде бы кто-то уже сталкивался с подобной ситуацией.
rangjungyeshe.ru
This post was edited by medar (2009-03-09 20:36, 15 years ago)
dervan
#20 2009-03-09 22:08
# medar : Кто-нибудь может прокомментировать, что происходит ? :) Как-то это всё нелогично..
Получается, что по ссылке на $GLOBALS парсинг работает дольше, чем при использовании локальной копии.

================

medar, я извиняюсь - не пойдёт этот хак scan_globals().

Во-первых, я не учёл, что после такой переделки весь $GLOBALS можно убить методом assign(), например так:
$t->assign('PHP', 'test_assign');
$t->assign(array('PHP' => 'test_assign_array'));

Добавлял в конец system/header.php такой код, всё так и есть - $GLOBALS уничтожается:
$t->assign('PHP', 'test_assign');

$t->parse("HEADER");
$t->out("HEADER");

echo '<pre>', strip_tags(print_r($GLOBALS, true)), '</pre>';

В принципе, можно в методе assign() проверять ключ на значение 'PHP' и не присваивать в этом случае значение. Но $GLOBALS всё равно можно убить напрямую через vars:
$t->vars['PHP'] = 'test_assign';
А vars - public, и менять это нельзя, могут отказаться работать какие-нибудь плагины.

К тому же есть нюансы при работе метода parse(). Например, такой код в конце system/header.php, плюс тег {PHP.TEST_DEFINE) в header.tpl:
define('TEST_DEFINE', 'test_define');
$TEST_DEFINE = '';

$t->parse("HEADER");
$t->out("HEADER");

echo $TEST_DEFINE, '<br />';
В случае оригинального scan_globals() глобальная переменная $TEST_DEFINE останется пустой строкой (значение будет присвоено её копии), а с переделанным scan_globals() после работы парсера $TEST_DEFINE получит значение 'test_define'.

И вдобавок по твоим тестам с переделанным scan_globals() парсер работает медленнее. Так что в сад. :)

Ещё раз извиняюсь.
medar
#21 2009-03-09 22:13
UPD
Провел тестирование на линуксовом серваке. Цифры стали логичными и предсказуемыми.
Все-таки php под виндой - это странная вещь. :)

Старый xtemplate
Requests per second: 16.30 [#/sec] (mean)
Time per request: 245.377 [ms] (mean)
Time per request: 61.344 [ms] (mean, across all concurrent requests)
Transfer rate: 123.87 [Kbytes/sec] received

Новый xtemplate + хак dervan (здесь и далее) шаблон без логики
Requests per second: 17.47 [#/sec] (mean)
Time per request: 229.007 [ms] (mean)
Time per request: 57.252 [ms] (mean, across all concurrent requests)
Transfer rate: 132.60 [Kbytes/sec] received

Новый xtemplate, шаблон с логикой, 1 условие
Requests per second: 16.78 [#/sec] (mean)
Time per request: 238.446 [ms] (mean)
Time per request: 59.611 [ms] (mean, across all concurrent requests)
Transfer rate: 128.34 [Kbytes/sec] received

Новый xtemplate, шаблон с логикой, 25 условий
Requests per second: 15.60 [#/sec] (mean)
Time per request: 256.485 [ms] (mean)
Time per request: 64.121 [ms] (mean, across all concurrent requests)
Transfer rate: 119.25 [Kbytes/sec] received
rangjungyeshe.ru
Sergeich
#22 2009-03-09 22:18
надо под нагрузкой всё это потестить для чистоты совести. А заодно в английскую ветку выложить, чтобы и там народ потестировал, может что интересное предложат.
medar
#23 2009-03-09 22:38
dervan
Да, наверное, лучше убрать.
Надо будет решить эту проблему по-другому - вообще отказаться от scan_globals(), а при парсинге тэгов {PHP.xxx} обращаться непосредственно к $GLOBALS.
rangjungyeshe.ru
dervan
#24 2009-03-09 23:42
# medar : dervan
Надо будет решить эту проблему по-другому - вообще отказаться от scan_globals(), а при парсинге тэгов {PHP.xxx} обращаться непосредственно к $GLOBALS.
Тогда посыпятся плагины, которые используют $t->vars.
Trustmaster
#25 2009-03-10 00:08
С чего бы? Через $t->vars обычно вытаскивают локальные переменные, к глобальным обращаются напрямую, иначе очень большая глупость получается.

ЗЫ: я тут глянул еще раз на код XTemplate. Возникает законный вопрос "неужели это всё хоть сколько-нибудь работоспособно" :-D
May the Source be with you!
medar
#26 2009-03-10 00:08
Вопрос, есть ли такие. Я верю в здравый смысл плагинописателей.
Если человек копался в коде и знает, что существует $t->vars, то он должен понимать, что брать оттуда данные, а не из например $cfg[] напрямую - это оперировать гланды через задницу. :)[/]
rangjungyeshe.ru
dervan
#27 2009-03-10 00:44
Эта гипотеза. Всё то, что я перечислил как доводы против переделки scan_globals(), сам бы ни за что не стал делать - изврат на изврате. :)
Sergeich
#28 2009-03-10 01:47
ну так может посмотрим пристально на другие шаблонизаторы. Если всё так не здорово в нашем, то пока не поздно внедрить новый, правильный шаблонизатор :). Пока плагинов мало под кот - это можно будет сделать относительно безболеззненно. написать хороший скрипт миграции и вперёд :).
esclkm
#29 2009-03-10 02:55
раз уже на икстеплейте то на икстемплейте.
тем более что у нас появился специалист по xtemplate - поэтому возможно скоро мы увидим medarTemplate
littledev.ru - мой маленький зарождающийся блог о котонти.
снижение стоимости программирования и снижение стоимости производства разные вещи. Первое можно скорее сравнить с раздачей работникам дешевых инструментов, чем со снижением зарплаты
medar
#30 2009-03-10 03:30
ну так может посмотрим пристально на другие шаблонизаторы
не, проще обустроить xtemplate.
Логику написали, теперь регулярки поправить внутри и все ок будет.
rangjungyeshe.ru

<<<1234>>>