Fenom — Еще Один Движок Шаблонов Php

Добрый день.

Выпущена первая стабильная версия нового шаблонизатора Феномен .

Для нетерпеливых, Феномен — это легкий (включая статистику), быстрый (включая тесты), гибкий (включая API) механизм шаблонов, который может стать хорошей заменой шаблонизаторам Twig или Smarty. Шаблонизатор Феномен является ярким примером того, как вопрос «Интересно, что может сделать расширение токенизатор ? может привести к появлению более чем пары изолированных сценариев.

Как и многие проекты, шаблонизатор запустился просто ради развлечения и был создан за один вечер.

Первая версия шаблонизатора занимала всего 900 строк кода, который анализировал примитивные шаблоны.

Чтобы сохранить расширяемость, в код шаблонизатора пришлось добавить еще 2500 строк кода.

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



Идеология

Когда стало понятно, что эксперимент вышел за рамки обычной игры-песочницы, появилось желание довести его до полноценного OpenSource-проекта, который можно было бы использовать в высоконагруженных проектах и конкурировать с популярными шаблонизаторами PHP. Шаблонизация в высоконагруженных проектах — очень сложная тема.

Когда вам приходится иметь дело с сотнями тысяч шаблонов пользовательского пространства, у всех шаблонизаторов появляются свои «тараканы».

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

  • Максимальная гибкость.

    Гибкость механизма шаблонов должна быть достаточной для добавления каких-либо функций или возможности изменения поведения механизма шаблонов при необходимости.

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

  • Доверяй, но проверяй.

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

    Это особенно актуально, когда к шаблонам имеют доступ обычные пользователи.

  • Чем быстрее тем лучше.

    Производительность должна быть сопоставима со скоростью генерации шаблона, написанного на чистом PHP-коде.

    И при определенных условиях шаблонизатор должен превосходить шаблоны на чистом PHP по скорости.

    Я считаю, что во избежание ненужных холиваров нужно уточнить этот момент: Если дать разработчику задачу реализовать некое представление на чистом PHP, то реализация, скорее всего, будет через ООП, не говоря уже о дублировании кода.

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

    Отличным примером является алгоритм наследования шаблонов.

  • Будьте проще, и люди к вам потянутся.

    Шаблонизатор, как и любой другой проект, должен основываться на принципе ЦЕЛОВАТЬ .

    Код максимально компактный и понятный, ООП без фанатизма, логика прослеживается везде.

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

    Это одна из причин, почему Fenom вообще не использует регулярные выражения для анализа шаблонов.

  • Старый друг лучше двух новых.

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

    В качестве основы Fenom использует синтаксис шаблонов, подобный Smarty, поскольку существует только один тип тегов, заключенный в фигурные скобки, и этот синтаксис легче преобразовать в токены.

  • Не ешьте много.

    Алгоритмы Fenom стараются максимально экономить ресурсы машины — как процессор, так и оперативную память.

    Шаблонизатор старается выполнить все сложные вычисления на этапе компиляции шаблона, чтобы выполнение было максимально быстрым и не ресурсоемким.

    В результате шаблонизатор имеет возможность отправлять данные в потоке (методы отображения и экспорта), не сохраняя их в памяти.

  • Не будь придурком.

    Шаблоны Fenom — это объекты, которые будут освобождать память, если на них нет ссылок, тогда как у Twig есть классы, у Smarty есть функции, которые невозможно удалить из памяти даже при желании, что может добавить сложностей при обработке большого количества шаблонов.

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



Производительность

Я одолжил набор тестов у друга ОВОЩИ из статьи Smarty против Twig: производительность , где Twig показал себя не с лучшей стороны.

С тех пор прошло достаточно много времени, поэтому я решил повторить тесты, приведенные в статье, с дополнительным противником – Феномом.

Действующие лица: Smarty версия 3.1.13, Twig версия 1.13.0 + расширение twig.so, Fenom версия 1.0.3. Очень хотелось протестировать Volt из родного фреймворка Phalcon, но, увы, на первом же тесте он зациклился, поэтому его пришлось дисквалифицировать.

Каждый тест проводился в трёх различных режимах:

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

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

    Однако, если кэш был сброшен, всплеск компиляций шаблонов может разрушить систему.

    Индикатор скорости компиляции, загрузки и выполнения шаблонов.

  • Регулярный запуск — шаблон уже скомпилирован в файловую систему, но не загружен в шаблонизатор.

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

    Индикатор актуален, если шаблон используется только один раз за выполнение скрипта.

    Значение характеризует скорость загрузки и выполнения шаблонов.

  • Горячий старт — шаблон скомпилирован и даже уже загружен в шаблонизатор.

    Указывает, что шаблон используется более одного раза при каждом вызове сценария.

    Индикатор скорости выполнения шаблона.

Тесты проводились на процессоре Intel Core i7 2,6 ГГц, 8 ГБ DDR3 1600 МГц, MacOS 10.8.4, PHP 5.4.15 из CLI. Ubuntu 12.04 показала такое же соотношение результатов.

PHP запускался с флагом -n, который отключает все внешние расширения.

Я протестировал это с помощью twig.so отдельно.

Результат был взят со второго тестового запуска, когда ОС уже была кэшированный файлы тестов и шаблонов.

Операционные кэшеры, конечно же, отключены, как и все другие расширения.

Итак, первый тест — вывести большое количество переменных.

По сути, этот тест имеет смысл, поскольку все шаблоны состоят из вывода переменных в шаблон.

Вывод большого количества переменных:

Шаблонизаторы Холодный запуск Регулярный запуск Горячий старт
умный3 4,3394 сек, 15,2 МБ 0,0239 сек, 9,2 МБ 0,0015 сек, 9,2 МБ
Ветка 1,9618 сек, 68,9 МБ 0,0341 сек, 17,0 МБ 0,0013 сек, 17,0 МБ
Феномен 0,3432 сек, 8,9 МБ 0,0157 сек, 6,6 МБ 0,0011 сек, 6,6 МБ
В самом первом тесте Twig изолировался — тесты провалились из-за превышения лимита памяти (по умолчанию 32МБ).

Второй тест — это итерация большого массива, что также часто встречается в шаблонах.

Итерация большого массива:

Шаблонизаторы Холодный запуск Регулярный запуск Горячий старт
умный3 0,0223 сек, 5,8 МБ 0,0036 сек, 3,1 МБ 0,0024 сек, 3,1 МБ
Ветка 0,0300 сек, 4,0 МБ 0,0174 сек, 2,7 МБ 0,0166 сек, 2,7 МБ
Ветка + расширение 0,0225 сек, 4,7 МБ 0,0064 сек, 3,2 МБ 0,0060 сек, 3,5 МБ
Феномен 0,0080 сек, 3,1 МБ 0,0022 сек, 2,5 МБ 0,0017 сек, 2,5 МБ
Третий тест — наследование большого количества шаблонов.

Я считаю этот тест более надуманным, поскольку достаточно более 2-3 уровней наследования, однако тест все равно имеет 100 уровней наследования.

Несмотря на всю надуманность, тест дает общее представление о производительности наследования шаблонов.

Наследование большого количества шаблонов:

Шаблонизаторы Холодный запуск Регулярный запуск Горячий старт
умный3 0,4165 сек, 10,1 МБ 0,0008 сек, 3,1 МБ 0,0001 сек, 3,1 МБ
Ветка 0,3626 сек, 11,2 МБ 0,0252 сек, 6,5 МБ 0,0021 сек, 6,5 МБ
Феномен 0,0569 сек, 3,2 МБ 0,0005 сек, 2,5 МБ 0,0000 сек, 2,5 МБ
Twig и здесь выделился, тест провалился из-за превышения допустимой вложенности, в данном случае рекурсии.

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

Нижняя граница Явным победителем стал Fenom, который значительно опередил Smarty и Twig как по скорости, так и по экономии ресурсов.

На втором месте Smarty, бронза достаётся Twig.

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

Ниже представлена таблица «жирности» кода:
Шаблонизатор Количество файлов Количество классов Количество строк кода
Умник (3.1.13) 320 190 55095
Веточка (1.13.0) 162 131 13908
Феном (1.0.4) 9 13 3967
Отмечу, что:
  • Смарти использует ЗУБР генератор синтаксического анализатора, создавший массу методов.

    Что ж, с точки зрения производительности он показал себя неплохо.

    Однако полученный код довольно неопрятный.

  • Ветка тугая сидит на обычном выражения, но я пила и хуже .

    Код красивый и читаемый, но вы можете меня сосчитать Маркус , переполнен сущностями.

  • Fenom в полной мере использует базовое расширение токенизатор (который также создан с использованием BISON).



Где взять?

Репозиторий: github.com/bzick/fenom Packagist.org: packagegist.org/packages/bzick/fenom Композитор:

"fenom/fenom": "1.*"

Документация: github.com/bzick/fenom/blob/master/docs/readme.md Баг трекер: github.com/bzick/fenom/issues

Что дальше?

На данный момент у Fenom уже достаточно большой набор.

возможности .

Но есть планы реализовать тег {родитель} чтобы наследовать шаблоны, добавьте операторы в И является , а также завершить и перевести документацию на английский язык.

Буду рад, если найдутся люди, желающие помочь.

P.S. Шаблонизатор все еще развивается и принимает все конструктивные предложения и критику, которые вы можете написать в комментариях ;) П.

П.

С.

Было много просьб добавить полноценный автофильтр, а также сырой фильтр.

В результате версия 1.0.7 уже имеет весь необходимый функционал для работы с автоматическим скринингом.

Теги: #php #templater #templater #fenom #движок шаблонов #smarty #twig #php

Вместе с данным постом часто просматривают: