Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Fenom — yet another PHP template engine

Anna | 31.05.2014 | нет комментариев

Доброго времени суток. Вышла первая стабильная версия нового шаблонизатора Fenom. Для нетерпеливых,Fenom — это легкий (статистика прилагается), стремительный (бенчмарк прилагается), эластичный (API прилагается) шаблонизатор, тот, что может стать благополучной заменой шаблонизаторам Twig либо Smarty.

Шаблонизатор Fenom является блестящим примером того, как вопрос «увлекательно, а на что способно растяжение tokenizer?» может привести к чему-то большему, чем пару скриптов в песочнице. Как и многие планы, шаблонизатор начинался just-for-fun и был сделан за один вечер. 1-й вариант шаблонизатора занимал каждого 900 строк кода, тот, что парсил простые образцы. Для поддержания расширяемости в код шаблонизатора пришлось добавить еще 2500 строк кода.

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

Идеология

Когда стало ясно, что эксперимент вышел за рамки традиционной игры в песочнице, возникло желание довести его до полновесного OpenSource плана, тот, что сумел бы применяться в highload планах и составить конкуренцию знаменитым PHP шаблонизаторам. Шаблонизация в highload планах дюже трудная тема. Когда доводится иметь дело с сотнями тысяч user-space образцов у всех шаблонизаторов начинают возникать свои «тараканы». К моменту создания Fenom, мне удалось поработать с такими PHP шаблонизаторами как Smarty2, Smarty3, Quicky, Twig, Latte. Навык работы с ними помог мне осознать каким должен быть шаблонизатор «моей желания» :)
При разработке шаблонизатора я усердствовал придерживаться следующих требований:

  • Максимальная эластичность. Эластичность шаблонизатора должна быть довольная, что бы добавить всякую функциональность либо же вероятность изменить поведение шаблонизатора при необходимости. Это диктуется тем, что автор шаблонизатора может быть не в курсе всех надобностей в шаблонизации, следственно должен дать вероятность растяжения шаблонизатора.
  • Доверяй, но проверяй. Безопасность шаблонизатора должна включать в себя не только охрану от разных инъекций, но и охрану от не положительного применения разных операторов самого шаблонизатора, которые могут привести к PHP ошибке при выполнении кода образца. Это исключительно актуально когда к образцам имеют доступ обыкновенные пользователи.
  • Чем стремительней, тем отменнее. Эффективность должна быть сопоставима со скоростью генерации образца написанного на чистом PHP коде. А при определенных условиях шаблонизатор должен выигрывать по скорости образцы на чистом PHP.
    Предполагаю, во избежание лишних холиваров, данный пункт нужно пояснить: Если дать задачу разработчику реализовать определенный view на чистом PHP, то реализация будет скорее каждого через ООП, не говоря теснее о дублировании кода. Шаблонизатор же лишен всех предрассудков и с легкостью создает простыни валидного кода, оптимизированного под стремительное выполнение. Хорошим примером является алгорифм наследования образцов.
  • Будь проще и люди к тебе потянутся. Шаблонизатор, как и всякий иной план, должен основываться на тезисе KISS. Код максимально суперкомпактен и внятен, ООП без фанатизма, всюду прослеживаемая логика. Это дюже значимо для всякого плана, так как чем огромнее кода в плане тем труднее его поддерживать, отлаживать, тестировать и привлекать сторонних разработчиков в такой план. Это одна из причин отчего в Fenom вообще не применяются регулярные выражения для разбора образцов.
  • Ветхий друг отменнее новых 2-х. Отменнее перенять общепризнанный легкой синтаксис существующих шаблонизаторов, чем внедрять новейший. В Fenom за основу взят Smarty-like синтаксис образцов, так как там каждого один вид тега обрамляемый в фигурные скобки и данный синтаксис проще преобразовать в токены.
  • Не жрать много. Алгорифмы Fenom усердствуют по максимуму сэкономить источники машины — как CPU, так и оперативной памяти. Все трудные вычисления шаблонизатор усердствует произвести на этапе компиляции образца, Дабы выполнение было максимально стремительным и не ресурсоемким. В следствии этого шаблонизатор имеет вероятность отдавать данные потоком (способы display ark!0.0064 sec, 3.2 MiB 0.0060 sec, 3.5 MiB Fenom 0.0080 sec, 3.1 MiB 0.0022 sec, 2.5 MiB 0.0017 sec, 2.5 MiB3-й тест — наследование большого числа образцов. Данный тест я считаю больше надуманным потому как больше 2-3х ярусов наследований хватает за глаза, тем не менее в тесте осталось 100 уровневое наследование. Не смотря на всю надуманность тест дает всеобщее представление о продуктивности наследования образцов.
    Наследование большого числа образцов:

    Шаблонизаторы Леденящий запуск Штатный запуск Жгучий запуск
    Smarty3 0.4165 sec, 10.1 MiB 0.0008 sec, 3.1 MiB 0.0001 sec, 3.1 MiB
    Twig 0.3626 sec, 11.2 MiB 0.0252 sec, 6.5 MiB 0.0021 sec, 6.5 MiB
    Fenom 0.0569 sec, 3.2 MiB 0.0005 sec, 2.5 MiB 0.0000 sec, 2.5 MiB

    Twig и здесь выделился, тест упал из-за превышения возможной вложенности, в данном случае рекурсии. Ошибку кинуло растяжение xDebug, которое в последствии для тестов отключил.

    Результат
    ?вственным победителем стал Fenom, тот, что в существенной степени опередил Smarty и Twig как по скорости, так и по экономии источников. На втором месте Smarty, бронзу получает Twig.

    Что же под капотом?

    Ниже приведена таблица «жирности» кода:

    Шаблонизатора число файлов число классов число строк кода
    Smarty (3.1.13) 320 190 55095
    Twig (1.13.0) 162 131 13908
    Fenom (1.0.4) 9 13 3967

    Подмечу что:

    • Smarty использует BISON генератор парсеров, тот, что наплодил тучу способов. Что ж, с точки зрения продуктивности он не нехорошо себя показал. Тем не менее полученный код достаточно не опрятен.
    • Twig плотно сидит на регулярных выражениях, но я видел и дрянней. Код славен, читабелен, но, можете считать меня Маркусом, переполнен сущностями.
    • Fenom во всю использует базовое растяжение tokenizer (тот, что так же построен при помощи BISON).

    Где взять?

    Репозиторий: github.com/bzick/fenom
    Packagist.org: packagist.org/packages/bzick/fenom
    Composer: "fenom/fenom": "1.*"
    Документация: github.com/bzick/fenom/blob/master/docs/main.md
    Баг трекер: github.com/bzick/fenom/issues

    Что дальше?

    На данный момент Fenom имеет теснее досточно огромный комплект вероятностей.

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB