Раньше слышал о шаблонизаторах, обертка для упрощения вывода данных, но насколько я наслышан он довольно сильно тормозит, как я понимаю из-за того что надо искать "конструкции" шаблонизатора и обрабатывать их, сейчас вот увидел очередную тему про шаблонизатор - viewtopic.php?t=51430 призадумался (да, да, я умею это делать) и пришла такая идея в голову, как думаете прокатит / поможет? шаблонизированный файл, имя у него допустим source_tpl.php, выглядит он примерно так: Код (Text): <!doctype html> <html> <head> <meta charset="utf-8" /> <title>{*title*}</title> </head> <body> <div class="menu">{*menu*}</div> <div class="content">{*content*}</div> </body> </html> далее мы создаем файл в котором храним хэш суммы, назовем его допустим hash.txt, в него я записываю данны в формате имя файла - хэш этого файла. далее принцип работы такой, пользователь переходит на страницу, начинается процесс, проверка существует ли страница, получение данных из БД, их обработка, после чего дело доходит до вывода данных т.е. обработки шаблона, процесс там будет такой: Происходит проверка существует ли файл final_tpl.php, если нет, мы получаем хэш файла source_tpl.php и записываем в файл hash.txt Далее мы получаем данные из файла source_tpl.php и преобразовываем шаблонные сущности в РНР сущности, и все что получилось сохраняем в файл final_tpl.php, он будет выглядеть уже так: Код (Text): <!doctype html> <html> <head> <meta charset="utf-8" /> <title><?php echo $title; ?></title> </head> <body> <div class="menu"><?php echo $menu; ?></div> <div class="content"><?php echo $content; ?></div> </body> </html> далее предоставляем данные по шаблону файла final_tpl.php. Потом заходит другой пользователь, дело доходит до шаблонного файла, там процесс уже такой: Проверяем существует ли файл final_tpl.php, да существует, получаем хэш файла source_tpl.php, сравниваем его с тем что в файле hash.txt, если все совпадает, выводим данные через файл final_tpl.php Если вдруг хэш не совпадает, т.е. файл source_tpl.php был изменен, тогда файл получаем новый хеш, записываем в файл, удаляем final_tpl.php и создаем его по новой.. Надеюсь сам принцип ясен. По поводу названия файлов, это все только для примера, если делать, то по отдельным папка засовывать и названия должны быть зеркальные Так же хранить хэш суммы можно в чем то другом. Так же за место хэш сумм можно использовать что то другое, например размер файла (но хэш вроде как будет точнее) из плюсов как я понимаю не надо будет обрабатывать шаблон, перебирать его регулярными выражениями, а просто сравнить хэш суммы, из минусов, будут создаваться файлы, собственно шаблоны будут жрать больше место. Так вот собственно вопрос был задан раньше, ускорит ли это работу?
да ты кеш изобрёл! =)))) Добавлено спустя 42 секунды: да, кешировать надо, фигли гонять похапе туда-сюда, если ничего не поменялось.
Ну насчет кэша, на сколько я видел, там делается кэш непосредственно страницы, допустим есть /index.php?id=5 где находится статья про то как правильно собирать коноплю, вот и кэшурется файл полностью включая саму статью. Я же делаю кэш шаблонных файлов и кэш этот существует пока исходный шаблон не будет изменен (хоть 500 лет). Так кто то делает? я изобретаю велик? И насчет как сравнивать файлы, лучше получать хэш сумму или размер файла (до байта)?
ммм.. хитрец. А хэш именно шаблонов используется в каких-нибудь шаблонизаторах / фреймворках / CMS? (в первую очередь интересует конечно шаблонизаторы) Добавлено спустя 9 минут: И еще такой вопрос, а я могу файлу задать какой-нибудь левый атрибут и потом считать его, ну в коже РНР это выглядело бы так: Код (PHP): class cls { public $a; } $obj = new cls(); $obj->xxx = 100; // свойства xxx я не создавал, но тут я его задал, оно существует, я могу к нему теперь обратится echo $obj->xxx;
ну я давно таким велосипедом пользуюсь. собственный формат шаблонов, очень близкий к пхпббшным (навеян временами когда олимпус писался). парсер читает входной html/css/js/ещечтонибудь, перегоняет в промежуточную версию заменяя встреченные лексемы внутреннего языка на определенные лексемы другого внутреннего языка. это нужно для допустимой логики условных и циклических алгоритмов. далее происходит линковка всех инструкций подключения - получаются огромные файлы, но которые уже не зависят от других файлов. далее идет оптимизация кода и собственно замена на конструкции пхп-лексемы. на продакшн приходят прекомплилированные шаблоны. ну потому что а зачем постоянно проверять не поменялся ли шаблон? поэтому там и шаблонизатор без парсера - только функции момента исполнения. а на девелоперском - шаблонизатор с разными плюшками собирается, что позволяет нормально отладку проводить и естественно каждый раз пересобирать пхп если меняется исходник шаблона. ну и верхом задротства поделюсь - вся система модульная а парсер использует метрики из имен методов. это позволяет написать "расширение" которое на нужном этапе "компиляции" заменит свои лексемы на промежуточный-оптимизированный-токинезированный код. ну и потом на этапе исполнения сработает если нужно. как я уже где-то в соседней ветке говорил - я согласен с игорем по поводу "пхп и есть шаблонизатор". а дальше программист использует то что ему лично удобно. мне удобно кататься на своем велосипеде. Добавлено спустя 9 минут 21 секунду: у меня на выходе компилированный шаблон содержит массив файлов которые использовались при сборке и самую крупную дату модификаци. прод-версия забивает на этот заголовок - ей главное что файл есть и она с ним работает. а дев-версия - получает метки времени всех файлов из списка и если они изменены позже указанной метки - запускается небольшая проверка. её суть в том что я не вижу смысла пересобирать всю цепочку использованную в шаблоне поэтому парсер (именно парсер. тут доступен парсер) смотрит на текущие хэш-суммы указанных файлов и смотрит какие хэш-суммы были на этапе компиляции. если что-то изменилось - идет обработка файла(-ов). далее смотрится на какие линковки это влияет и делается их пересборка. и последним шагом - замена на лексемы пхп тоже только где это было нужно. таким образом можно случайно файл потрогать и если не изменится его хэш-сумма - это не будет запускать лишнюю перекомпиляцию шаблона - парсер досрочно завершит свою работу не отняв драгоценное время.
Я за вас очень рад Ну вообще меня интересует, может это есть в каких то шаблонизаторах, проще наверное выучить готовое и продуманное, нежели писать своё, тем более если дело касается меня Я такое напишу, мало не покажется PS спасибо за подробное описание
Я кеширую результаты работы запрос к базам данных, результаты сложных расчётов. А html-код формируется же очень быстро, зачем что-то тут кешировать? Пусть себе налету формируется.
Я где то до этого писал, что кто то там пользовался шаблонизатором и при выполнении какого то действия он сильно тормозил (как я понимаю потому что приходилось парсить шаблонные сущности). igordata неоднократно жаловался что MODX долго рожает страницу, я скачал видео по MODX, там сайт делают, там чувак поставил какой то плагин, который по сути делал кэш шаблонов, и он сказал что это сильно ускоряет работу, что он все врут что ли?
протокол передачи гипертекста позволяет очень-очень гибко управлять теми данными которые сервер отдал пользователю. мне не жалко конечно, но какой смысл если страница меняется раз в месяц генерировать её из раза в раз при каждом запросе? лучше пусть пых пометит её условием кэширования а браузер придет ко мне с требованием "есть чо?" на что я решу что у него уже всё есть ли запущу генерацию нового. это отношение сервер-клиент. можно еще сделать отношение сервер-мир по которому я один раз генерирую а далее ко мне может любой человек зайти и не важно есть у него копия данных или нет - у меня данные не изменились и пусть веб-сервер отдает то что уже когда-то было сделано.
Все, что ты можешь делать с файлом, определяется файловой системой, которая его обслуживает, а не PHP. Дописывать рандомные поля к файлам сегодня, из популярных ФС, вроде ни одна не позволяет, ибо нефиг.
Не читал всю тему, только первый пост. VLK ты изобрел компилируемый шаблон. Вместо этого существуют нативные шаблоны. По сути, это говнокод - php в перемешку с html, но если соблюдать правила - не включать в шаблоны ничего, кроме echo, if и for/foreach, то вроде как кошерно. На самом деле PHP изначально шаблонизатор. Препроцессор гипертекста, гипертекст это HTML, а препроцессор подставляет в него динамические данные. К тому же шорт-тег <?= убирать не будут, так что можно не париться и забыть изобретать синтаксис {*title*}, если у тебя ничего продвинутого в синтаксис не заложено. А даже если и заложены сниппеты, можно вместо них прямо дергать функции. Главное чтобы соблюдалось какое-нибудь соглашение на счет этих функций. Добавлено спустя 3 минуты 2 секунды: Ну ты бы блин хоть попробовал. Это прокатывает с любым объектом.
Я свой путь в программировании начина с С++ и С#, там такое не прокатывает и собственно тут (в РНР) я ни где подобного не видел (в книгах) и не думал что такое возможно, ну а зачем как говорится, так что меня удивило что такое возможно. Ну в принципе да, я хочу делать штуку, которая будет переводить шаблонный файл в нативный шаблон.
справедливости ради надо заметить что если в объекте будет свойство с таким именем, но недоступное публично - не прокатит.
Не работал с modx, но читал о нём. Эта штуковина вроде свои чанки всякие хранит в базе, и при отображении должна считать. Вот и рожает долго. А плагин кеширует видимо это всё дело. И всё ускоряется.
Что только народ не придумает, чтобы себе жизнь усложнить... Создается впечатление, что все эти шаблонизаторы - это костыли, которыми разработчик наказывает сам себя за то, что архитектуру кривую наваял, которая не может в нормальную генерацию страниц по какой-то причине.
Это была модная тенденция. Она - говно. Усё. Она останется навсегда, но концепцию надо менять в головах. Не должна каждая секретутка без знаний рулить контентом сайта. Не должна и пнх.
Что то вы не в ту сторону клоните, я вот читая в разных темах этого форума, кстати от вас всех усвоил одно из основополагающих преимуществ РНР, это то, что на нем надо писать в разы меньше, чем на других языках и если бы не это свой свойство, РНР бы уже давно пошел спать (ну это я уже сам додумал). Кто то придумал шаблонизатор, что бы меньше писать кода, это укладывается в концепцию РНР, о каком усложнении жизни идет речь? Добавлено спустя 5 минут 16 секунд: И вопрос по уже существующим шаблонизаторам, просьба дать ответ, т.к. если вы в курсе то ответ да / нет, а если мне искать, это 500 минут у меня займет. Я вот допустим набрел на шаблонизатор Смарту (Smarty) и там речь идет о компилировании, а что за компиляция? как я понимаю это то, что я описал выше, т.е. пишется в шаблонном виде сначала (HTML с шаблонными сущностями за место РНР код), а потом шаблонные сущности преобразовываются в РНР код, сохраняются в отдельный файл и этот файл используется?
Дык это единственный смысл существования любого языка - решать свою задачу эффективнее, чем другие. Эффективность PHP в скорости разработки в первую голову.