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 ;)
Очень много статей было прочтено про эти шаблонизаторы, и выхода было 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 комментария
если шаблонизатор как Вы говорите расширяем то почему бы не расширить и добавить в него стандартный обработчик объектов и массивов для smarty. Вы представьте сколько шаблонов переводить то…
И логические выражения {% for var in vars %}, тоже не привести к виду «смарти».
Это единственный минус, что придется переписывать код шаблонов, но за ним есть гора плюсов.
Ну а остальное — дело привычки, я пока переписывал 6-7 страниц (для главной) уже привык.
К любому шаблонизатору можно привыкнуть и это не займет много времени, а увеличение производительности дополнительная мотивация.
Совсем противоположные данные: Смарти3 быстрее Твига на порядок, только в маленьких и простых страничках они по скорости могут уравнятся.
Процитирую еще одного человека из топика выше:
Скорость это Blitz
Твиг я интегрировал для своих проектов, и наследование шаблонов меня не интересует.
Интересно будет посмотреть Ваши наработки в продакшене, но я честно не думаю, что скорость работы это преимущество Twig над Smarty 3
Буду рад потыркать )
тем более что уже известно что Твиг медленнее?
P.S: я не за Smarty и не за Twig, за стабильность и скорость :)
Но наследование шаблонов — это колоссальное преимущество Смарти, которое пока никак не используется. А зря. И, надеюсь, только пока. Если вместо хуков внутри шаблонов использовать систему Смарти-блоков и наследование — это реально крутая вещь может получится для плагинов
Типизация — вещь хорошая.
даже не так, а {{ oUserCurrent.id }}, попробуйте уверяю работает
Twig сам ищет метод get для метода, поля (точко-обекта)
Я поддерживаю идею с Twig, очень хорошо расширяется, а в связке с + haml + sass так ето ваще красота неописуема)
зачем копипастить закривающий тег?
HAML VS HTML
что круче
или
YAML vs PHP arrays
или
Привыкнуть не сложно, дело 20 минут, с них 10 — чтение кратенького мануала по красивому языку. Код становится семантичним, читабельным благодоря минимизации служебных символов и задания логики кода с помощью табуляции, тоесть неверная табуляция — неверный код в итоге
А использование yaml например в конфиге это уже сомнительный изврат.
От haml крыша у пользователей поедет, но не спорю что можно бы сделать такую фичу для желающих. Может быть вы и займетесь?
А с итегрированием haml придется повозится и проблемы думаю будут не радужней чем у Shatter 'а. Ну а yaml как уже сказал только если в конфиге и то его тоже придется компилировать для большей производительности и кэшировать.
Я лично за, что мешает ls иметь разные шаблонизаторы на выбор которые можно закачать бесплатно или даже платно с каталога. Но встраивать это нативно наверно будет опасно для смертных. А с yaml, haml имел дело на рельсах и остался доволен, удобно. Главное не болтать, а реализовать.