За последние 24 часа нас посетили 17708 программистов и 1655 роботов. Сейчас ищут 910 программистов ...

Шаблонизация

Тема в разделе "PHP для новичков", создана пользователем VLK, 11 янв 2015.

  1. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Раньше слышал о шаблонизаторах, обертка для упрощения вывода данных, но насколько я наслышан он довольно сильно тормозит, как я понимаю из-за того что надо искать "конструкции" шаблонизатора и обрабатывать их, сейчас вот увидел очередную тему про шаблонизатор - viewtopic.php?t=51430 призадумался (да, да, я умею это делать) и пришла такая идея в голову, как думаете прокатит / поможет?

    шаблонизированный файл, имя у него допустим source_tpl.php, выглядит он примерно так:
    Код (Text):
    1. <!doctype html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8" />
    5. <title>{*title*}</title>
    6. </head>
    7. <body>
    8. <div class="menu">{*menu*}</div>
    9. <div class="content">{*content*}</div>
    10. </body>
    11. </html>
    далее мы создаем файл в котором храним хэш суммы, назовем его допустим hash.txt, в него я записываю данны в формате имя файла - хэш этого файла.

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

    Происходит проверка существует ли файл final_tpl.php, если нет, мы получаем хэш файла source_tpl.php и записываем в файл hash.txt
    Далее мы получаем данные из файла source_tpl.php и преобразовываем шаблонные сущности в РНР сущности, и все что получилось сохраняем в файл final_tpl.php, он будет выглядеть уже так:
    Код (Text):
    1. <!doctype html>
    2. <html>
    3. <head>
    4. <meta charset="utf-8" />
    5. <title><?php echo $title; ?></title>
    6. </head>
    7. <body>
    8. <div class="menu"><?php echo $menu; ?></div>
    9. <div class="content"><?php echo $content; ?></div>
    10. </body>
    11. </html>
    далее предоставляем данные по шаблону файла final_tpl.php.

    Потом заходит другой пользователь, дело доходит до шаблонного файла, там процесс уже такой:
    Проверяем существует ли файл final_tpl.php, да существует, получаем хэш файла source_tpl.php, сравниваем его с тем что в файле hash.txt, если все совпадает, выводим данные через файл final_tpl.php

    Если вдруг хэш не совпадает, т.е. файл source_tpl.php был изменен, тогда файл получаем новый хеш, записываем в файл, удаляем final_tpl.php и создаем его по новой..

    Надеюсь сам принцип ясен.
    По поводу названия файлов, это все только для примера, если делать, то по отдельным папка засовывать и названия должны быть зеркальные
    Так же хранить хэш суммы можно в чем то другом.
    Так же за место хэш сумм можно использовать что то другое, например размер файла (но хэш вроде как будет точнее)

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

    Так вот собственно вопрос был задан раньше, ускорит ли это работу?
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    да ты кеш изобрёл! =))))

    Добавлено спустя 42 секунды:
    да, кешировать надо, фигли гонять похапе туда-сюда, если ничего не поменялось.
     
  3. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Ну насчет кэша, на сколько я видел, там делается кэш непосредственно страницы, допустим есть /index.php?id=5 где находится статья про то как правильно собирать коноплю, вот и кэшурется файл полностью включая саму статью.

    Я же делаю кэш шаблонных файлов и кэш этот существует пока исходный шаблон не будет изменен (хоть 500 лет).
    Так кто то делает? я изобретаю велик?

    И насчет как сравнивать файлы, лучше получать хэш сумму или размер файла (до байта)?
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    достаточно сравнить дату на самом деле =)
     
  5. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    ммм.. хитрец.

    А хэш именно шаблонов используется в каких-нибудь шаблонизаторах / фреймворках / CMS? (в первую очередь интересует конечно шаблонизаторы)

    Добавлено спустя 9 минут:
    И еще такой вопрос, а я могу файлу задать какой-нибудь левый атрибут и потом считать его, ну в коже РНР это выглядело бы так:
    Код (PHP):
    1. class cls
    2. {
    3.     public $a;
    4. }
    5.  
    6. $obj = new cls();
    7. $obj->xxx = 100; // свойства xxx я не создавал, но тут я его задал, оно существует, я могу к нему теперь обратится
    8. echo $obj->xxx; 
     
  6. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ну я давно таким велосипедом пользуюсь. собственный формат шаблонов, очень близкий к пхпббшным (навеян временами когда олимпус писался). парсер читает входной html/css/js/ещечтонибудь, перегоняет в промежуточную версию заменяя встреченные лексемы внутреннего языка на определенные лексемы другого внутреннего языка. это нужно для допустимой логики условных и циклических алгоритмов. далее происходит линковка всех инструкций подключения - получаются огромные файлы, но которые уже не зависят от других файлов. далее идет оптимизация кода и собственно замена на конструкции пхп-лексемы.
    на продакшн приходят прекомплилированные шаблоны. ну потому что а зачем постоянно проверять не поменялся ли шаблон? поэтому там и шаблонизатор без парсера - только функции момента исполнения.
    а на девелоперском - шаблонизатор с разными плюшками собирается, что позволяет нормально отладку проводить и естественно каждый раз пересобирать пхп если меняется исходник шаблона.
    ну и верхом задротства поделюсь - вся система модульная а парсер использует метрики из имен методов. это позволяет написать "расширение" которое на нужном этапе "компиляции" заменит свои лексемы на промежуточный-оптимизированный-токинезированный код. ну и потом на этапе исполнения сработает если нужно.

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

    Добавлено спустя 9 минут 21 секунду:
    у меня на выходе компилированный шаблон содержит массив файлов которые использовались при сборке и самую крупную дату модификаци. прод-версия забивает на этот заголовок - ей главное что файл есть и она с ним работает. а дев-версия - получает метки времени всех файлов из списка и если они изменены позже указанной метки - запускается небольшая проверка. её суть в том что я не вижу смысла пересобирать всю цепочку использованную в шаблоне поэтому парсер (именно парсер. тут доступен парсер) смотрит на текущие хэш-суммы указанных файлов и смотрит какие хэш-суммы были на этапе компиляции. если что-то изменилось - идет обработка файла(-ов). далее смотрится на какие линковки это влияет и делается их пересборка. и последним шагом - замена на лексемы пхп тоже только где это было нужно. таким образом можно случайно файл потрогать и если не изменится его хэш-сумма - это не будет запускать лишнюю перекомпиляцию шаблона - парсер досрочно завершит свою работу не отняв драгоценное время.
     
  7. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Я за вас очень рад :)
    Ну вообще меня интересует, может это есть в каких то шаблонизаторах, проще наверное выучить готовое и продуманное, нежели писать своё, тем более если дело касается меня :)
    Я такое напишу, мало не покажется :)

    PS спасибо за подробное описание
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  9. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Я кеширую результаты работы запрос к базам данных, результаты сложных расчётов. А html-код формируется же очень быстро, зачем что-то тут кешировать? Пусть себе налету формируется.
     
  10. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Я где то до этого писал, что кто то там пользовался шаблонизатором и при выполнении какого то действия он сильно тормозил (как я понимаю потому что приходилось парсить шаблонные сущности).
    igordata неоднократно жаловался что MODX долго рожает страницу, я скачал видео по MODX, там сайт делают, там чувак поставил какой то плагин, который по сути делал кэш шаблонов, и он сказал что это сильно ускоряет работу, что он все врут что ли?
     
  11. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    протокол передачи гипертекста позволяет очень-очень гибко управлять теми данными которые сервер отдал пользователю. мне не жалко конечно, но какой смысл если страница меняется раз в месяц генерировать её из раза в раз при каждом запросе? лучше пусть пых пометит её условием кэширования а браузер придет ко мне с требованием "есть чо?" на что я решу что у него уже всё есть ли запущу генерацию нового. это отношение сервер-клиент. можно еще сделать отношение сервер-мир по которому я один раз генерирую а далее ко мне может любой человек зайти и не важно есть у него копия данных или нет - у меня данные не изменились и пусть веб-сервер отдает то что уже когда-то было сделано.
     
  12. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Мой движок для статических сайтов очень даже удобен :D
     
  13. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Я буду ждать пока AnteFil напишет движок и буду его движком пользоваться.
     
  14. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Все, что ты можешь делать с файлом, определяется файловой системой, которая его обслуживает, а не PHP. Дописывать рандомные поля к файлам сегодня, из популярных ФС, вроде ни одна не позволяет, ибо нефиг.
     
  15. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Да кстати, совсем про этот вопрос забыл, спасибо за ответ.
     
  16. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Не читал всю тему, только первый пост.
    VLK ты изобрел компилируемый шаблон. Вместо этого существуют нативные шаблоны. По сути, это говнокод - php в перемешку с html, но если соблюдать правила - не включать в шаблоны ничего, кроме echo, if и for/foreach, то вроде как кошерно.
    На самом деле PHP изначально шаблонизатор. Препроцессор гипертекста, гипертекст это HTML, а препроцессор подставляет в него динамические данные. К тому же шорт-тег <?= убирать не будут, так что можно не париться и забыть изобретать синтаксис {*title*}, если у тебя ничего продвинутого в синтаксис не заложено.
    А даже если и заложены сниппеты, можно вместо них прямо дергать функции. Главное чтобы соблюдалось какое-нибудь соглашение на счет этих функций.

    Добавлено спустя 3 минуты 2 секунды:
    Ну ты бы блин хоть попробовал. Это прокатывает с любым объектом.
     
  17. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Я свой путь в программировании начина с С++ и С#, там такое не прокатывает и собственно тут (в РНР) я ни где подобного не видел (в книгах) и не думал что такое возможно, ну а зачем как говорится, так что меня удивило что такое возможно.


    Ну в принципе да, я хочу делать штуку, которая будет переводить шаблонный файл в нативный шаблон.
     
  18. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    справедливости ради надо заметить что если в объекте будет свойство с таким именем, но недоступное публично - не прокатит.
     
  19. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я ж дал ссылку.
     
  20. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Не работал с modx, но читал о нём. Эта штуковина вроде свои чанки всякие хранит в базе, и при отображении должна считать. Вот и рожает долго. А плагин кеширует видимо это всё дело. И всё ускоряется.
     
  21. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Что только народ не придумает, чтобы себе жизнь усложнить...
    Создается впечатление, что все эти шаблонизаторы - это костыли, которыми разработчик наказывает сам себя за то, что архитектуру кривую наваял, которая не может в нормальную генерацию страниц по какой-то причине.
     
  22. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Это была модная тенденция. Она - говно. Усё. Она останется навсегда, но концепцию надо менять в головах. Не должна каждая секретутка без знаний рулить контентом сайта. Не должна и пнх.
     
  23. VLK

    VLK Старожил

    С нами с:
    15 дек 2013
    Сообщения:
    3.010
    Симпатии:
    58
    Что то вы не в ту сторону клоните, я вот читая в разных темах этого форума, кстати от вас всех усвоил одно из основополагающих преимуществ РНР, это то, что на нем надо писать в разы меньше, чем на других языках и если бы не это свой свойство, РНР бы уже давно пошел спать (ну это я уже сам додумал).

    Кто то придумал шаблонизатор, что бы меньше писать кода, это укладывается в концепцию РНР, о каком усложнении жизни идет речь?

    Добавлено спустя 5 минут 16 секунд:
    И вопрос по уже существующим шаблонизаторам, просьба дать ответ, т.к. если вы в курсе то ответ да / нет, а если мне искать, это 500 минут у меня займет.
    Я вот допустим набрел на шаблонизатор Смарту (Smarty) и там речь идет о компилировании, а что за компиляция? как я понимаю это то, что я описал выше, т.е. пишется в шаблонном виде сначала (HTML с шаблонными сущностями за место РНР код), а потом шаблонные сущности преобразовываются в РНР код, сохраняются в отдельный файл и этот файл используется?
     
  24. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Дык это единственный смысл существования любого языка - решать свою задачу эффективнее, чем другие. Эффективность PHP в скорости разработки в первую голову.
     
  25. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Это маркетинговое название генерации php-файлика.