Die Smarty! Шаблонизатор Twig

Die Smarty! Шаблонизатор TwigМое рвение оптимизировать все и вся не оставляет меня в покое. Я очень долго тестировал производительность VDS против производительности облака, я очень долго подбирал софт и выбирал ОС для серверной части. Все это пытался настроить так, чтобы производительность была на высоте, и, на этой стороне я, кажется, достиг цели. Далее у меня шел сам LiveStreet. Я хотел не только ускорить его работу, но и расширить функционал. И первым делом решил взяться за шаблонизатор, т.к. Smarty не устраивал меня своей скоростью.

Очень много статей было прочтено про эти шаблонизаторы, и выхода было 2: Twig или отказаться от обработчиков шаблонного кода вовсе. Решил для начала опробовать Twig (ведь его разработчики еще трудятся над фреймворком Symfony, что уже воодушевляет). Внедрение его в LS не заняла больше 30 минут, это оказалось очень просто. После его интеграции я решил опробовать его быстродействие, на сервере где установлен apache+php, без всяких модулей оптимизации php кода (типа eAccelerator, APC, memcache и т.п.), был установлен чистый LS, без всяких модулей, и без контента. Со Smarty страница генерировалась от 0.2 до 0.4 секунды, с шаблонизатором Twig генерация не занимала более 0.17 секунд (0.17 максимальное значение на главной, минимальное — 0.09).

При интеграции перед мной встали пара нюансов — это тэги LS (hook, router, cfg и т.п.), от части я просто отказался, например вместо {router page='blogs'} можно написать {$aRouter.blogs}, тоже самое и с конфигами: вместо {cfg name='view.name'} можно написать {$oConfig->get('view.name')}. Казалось бы, мелочи, но мы сохраняем бесконечно малую часть производительности, отказавшись от этих тэгов. Теперь я расскажу про тег {hook run='some_hook'}. Twig я интегрировал для собственных разработок, не планируя выводить его в свет, поэтому и от хуков в шаблонах я тоже отказался, возможно, придется их внедрить.

Шаблонизатор порадовал меня не только своей скоростью, но и синтаксисом, функционалом и расширяемостью. Например в нем есть универсальный фильтр для объектов и массивов, т.е. раньше мы писали {$oUserCurrent->getId()}, а сейчас {{ oUserCurrent.getId }} — выглядит лаконичнее, да и верстальщика не испугаешь :)

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

Сейчас он интегрирован жестко, без использования плагинизации, как только я допишу для него использование хуков, а так-же некоторых стандартный методов модуля Viewer (например сейчас не работает Fetch, GetLocalViewer), я выложу его в свет.

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

И на последок я оставлю пару линков на документацию и на исходники.

Спасибо за внимание, ждите новый шаблонизатор для LS ;)

34 комментария

avatar
весьма интересно, но есть момент…
Должен сразу предупредить не компетентных читателей, это шаблонизатор, после его установки у вас перестанут обрабатываться существующие шаблоны, их придется переписывать под другой синтаксис.
если шаблонизатор как Вы говорите расширяем
Шаблонизатор порадовал меня не только своей скоростью, но и синтаксисом, функционалом и расширяемостью
то почему бы не расширить и добавить в него стандартный обработчик объектов и массивов для smarty. Вы представьте сколько шаблонов переводить то…
avatar
Есть расширяемость, но она не позволяет приводить тэги к виду {$var}, придется писать {{ var }}. Конечно {{ и }} можно изменить на произвольные символы, но не на такие, как у смарти.

И логические выражения {% for var in vars %}, тоже не привести к виду «смарти».

Это единственный минус, что придется переписывать код шаблонов, но за ним есть гора плюсов.
avatar
да код шаблонов впринципе переписать то не так уж и сложно… автозаменами можно достаточно бысто все переписать, а вот переучиваться от одного синтаксиса к другому думаю тоже не многие захотят… так что тут плюс использования думаю будет только в скорости… хотя и достаточно весомый плюс
avatar
Да и не только, я мельком глянул документацию самого шаблонизатора, возможностей намного больше. Так-же разработчики предоставляют расширения для редакторов, чтобы синтаксис подсвечивать.

Ну а остальное — дело привычки, я пока переписывал 6-7 страниц (для главной) уже привык.
avatar
Twig… Чёрт побери, Twig! Так непривычно просле джинджи верстать шаблоны LS, а с твигом бы ох как.
  • denf
  • +3
avatar
Было бы здорово! Дорабатывайте и выкладывайте хоть в каталог, хоть пулом на гит хаб.
К любому шаблонизатору можно привыкнуть и это не займет много времени, а увеличение производительности дополнительная мотивация.
avatar
если он куда быстрее и лучше «Smarty» то почем бы нет? Переписать синтаксис то дела наживное :)
avatar
По производительности сравнение можно посмотреть здесь — habrahabr.ru/blogs/php/128083/
  • ort
  • +3
avatar
Выдержка (для остальных):
Совсем противоположные данные: Смарти3 быстрее Твига на порядок, только в маленьких и простых страничках они по скорости могут уравнятся.
avatar
Все резко передумали.
avatar
толку от производительности? шаблон компилируется не всегда же, а только когда необходимо, а ето капец как не часто
avatar
Быстрее говорите? Не вводите людей в заблуждение )
Процитирую еще одного человека из топика выше:
Скорость это Blitz
avatar
Уступает только в наследовании и цикле? Я же руководствовался этой и этой статьей.
avatar
2009го года?
avatar
Еще я в топике написал реальные цифры, до смарти и после.
Твиг я интегрировал для своих проектов, и наследование шаблонов меня не интересует.
avatar
Ну Вы вроде как вырезали хуки и все конструкции языка. Странно было бы если шаблоны при этом генерировались медленнее.

Интересно будет посмотреть Ваши наработки в продакшене, но я честно не думаю, что скорость работы это преимущество Twig над Smarty 3
avatar
Ну-с, Твиг по функционалу не уступает Смарти.
avatar
Выкладывайте когда что-то будет, Юрий.
Буду рад потыркать )
avatar
ну да — по функционалу. но стоит ли оно того (вам ведь ещё хуки и т.п. добавить предстоит)?
тем более что уже известно что Твиг медленнее?
avatar
А, и еще, я не вырезал хуки, я просто не реализовывал их механизм.
avatar
сейчас вот читаю но все же одно дело там написано другое дело узнать в деле, если автор доделает посмотрим в деле и думаю будет виден результат на лицо
P.S: я не за Smarty и не за Twig, за стабильность и скорость :)
avatar
Чуть более года назад тоже очень внимательно смотрел в сторону Твига. Но решил дождаться 3-ей версии Смарти, и после того, как она вышла, решил, что смена шила на мыло — не стоит оно всей этой возни. Во-первых, скорость Смарти значительно возросла, и сейчас, если не использовать наследование шаблонов, то они примерно равнозначны по скорости.

Но наследование шаблонов — это колоссальное преимущество Смарти, которое пока никак не используется. А зря. И, надеюсь, только пока. Если вместо хуков внутри шаблонов использовать систему Смарти-блоков и наследование — это реально крутая вещь может получится для плагинов
avatar
Вот насчет наследовнаия плюсую. Давно пора.
avatar
Например в нем есть универсальный фильтр для объектов и массивов, т.е. раньше мы писали {$oUserCurrent->getId()}, а сейчас {{ oUserCurrent.getId }} — выглядит лаконичнее, да и верстальщика не испугаешь :)
Да, но раньше было сразу понятно где массивы, а где обьекты, а так — все в кучу.
Типизация — вещь хорошая.
avatar
раньше мы писали {$oUserCurrent->getId()}, а сейчас {{ oUserCurrent.getId }}

даже не так, а {{ oUserCurrent.id }}, попробуйте уверяю работает
Twig сам ищет метод get для метода, поля (точко-обекта)
Я поддерживаю идею с Twig, очень хорошо расширяется, а в связке с + haml + sass так ето ваще красота неописуема)
avatar
Насчет haml я бы не сказал, а sass давно пора.
avatar
+ еще yaml забыл
зачем копипастить закривающий тег?
HAML VS HTML
что круче
%a.someclass.class2#iiiddd(href="http://google.com" title="sometitle")
  %span.class2 Текст ссылки

или
<a class="someclass class2" id="iiiddd" href="http://google.com" title="sometitle">
<span class="class2">Текст ссылки</span><a>


YAML vs PHP arrays
a:
    b: c
    d:
        e:f
        x:y
        z: [ aa, bb, cc ]
        c: { q: w, d:f }

или
$a = array(
    "b" => c,
    "d" => array(
        "e" => "f"
        "x" => "y"
        "z" => array("aa", "bb", "cc")
        "c" => array("q" => "w", "d" => "f")
        )    
);

Привыкнуть не сложно, дело 20 минут, с них 10 — чтение кратенького мануала по красивому языку. Код становится семантичним, читабельным благодоря минимизации служебных символов и задания логики кода с помощью табуляции, тоесть неверная табуляция — неверный код в итоге
avatar
С sass это одно дело. Стили мы будем кэшировать и в дальнейшем использовать это действительно было бы удобно и не капли не снижающе производительность.

А использование yaml например в конфиге это уже сомнительный изврат.

От haml крыша у пользователей поедет, но не спорю что можно бы сделать такую фичу для желающих. Может быть вы и займетесь?
avatar
С sass это одно дело. Стили мы будем кэшировать и в дальнейшем использовать
Дак а html кто мешает кешировать? все шаблонизатори используют кеш
avatar
Да, я просто описал насколько просто интегрировать sass. Размышления в слух.

А с итегрированием haml придется повозится и проблемы думаю будут не радужней чем у Shatter 'а. Ну а yaml как уже сказал только если в конфиге и то его тоже придется компилировать для большей производительности и кэшировать.

Я лично за, что мешает ls иметь разные шаблонизаторы на выбор которые можно закачать бесплатно или даже платно с каталога. Но встраивать это нативно наверно будет опасно для смертных. А с yaml, haml имел дело на рельсах и остался доволен, удобно. Главное не болтать, а реализовать.
avatar
avatar
Надо обсудить все его возможности :)
avatar
Поставил сырую версию на сервер, время генерации страницы поразило — скачет от 0.02 до 0.04.
avatar
Прошу на оценку, пока нет реализации хуков, нет документации по использованию в LS. Все это будет к концу недели.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.