All streams
Search
Write a publication
Pull to refresh
35
0
Иван @Aco

Программист, Web-разработчик

Send message
Да, задавался я таким вопросом и вот что сказал мой опыт:
1. Кешировать результат отрисовки всего лучше у nginx или заголовком 304 Not Modified.
2. Если нужно частичное в шаблоне кеширование, то можно ввести тег {cache id="..."}{/cache} который будет по id сохранять и забирать из кеша данные. Появляется вопрос о настройки кешера для тега. Реализация будет отдельным пакетом, который добавляет тег {cache}.
3. Если нужно закешировать результат шаблона целиком то можно переопределить метод display + тег {include} на котором базируются другие методы и там завести необходимые ключи для кеша. Реализация будет отдельным пакетом, который предоставляет trait и/или класс переопределяющий метод display, адаптируя его для кеширования.

Все варианты выполнимы и могут быть реализованы как сторонний пакет. Сам пока не остановился на определенном варианте. Но во всех случая ключ для кеша указывается в ручную.
Данные подставляются в кеше, в самом коде PHP, как в примере выше. Мне кажется, что вы имеете ввиду кеш результата работы шаблона?
Если включен флаг Fenom::FORCE_COMPILE то всегда перекомпилирует, это для отладки. Если включен флаг Fenom:: AUTO_RELOAD то шаблонизатор перед использованием шаблона проверяет mtime оригинального шаблона и его кеша, если не совпадают — перекомпилирует. В других случая компиляция вызывается только если нет кеша шаблона.
Нет, Fenom кеширует PHP код шаблона на файловой системе. Только сейчас заметил, что об это нет ни слова в документации…
Согласен, есть небольшие усложнения. Был бы очень рад если кто-нибудь сделал код-ревью, результатом которого issue со всеми ;)
Так оно и есть, пример скомпиленного шаблони (тест с итерациями массива).
Смотрите комментарий выше
Оп-кешер, только кеширует оп код, но не ускоряет его. Прирост может быть только за счет ускорения include/require. Не исключено, что на холодный старт это могло повлиять, поэтому я добавлю в доку тесты с включенным APC, пока просто времени не было так как там надо все делать изолировано друг от друга, что бы один тест не повлиял на результат другого.

Согласен тесты довольно синтетические, но общее представление они дают.
Полагаю в имеете ввиду Fenom::AUTO_ESCAPE автоэкранирование переменных? Да, в документации, по ошибке, пропущена данная опция, исправлю. На счет модификатора raw, пока не уверен как работает в других шаблонизаторах, но тут за него отлично сойдет модификатор unescape
Вы не поверитие, это goto заменило 80 строк кода, один класс и 2 блока с try {} catch{}. Так вышло что тут было удобнее использовать goto, как бы не хотелось
1. Да, планирую.
2. Какого рода кеширование?
Поясните ваше беспокойство
Честно, я даже не знал что он еще жив)
Я тоже планировал это сделать, но не смог нащупать ту самую границу когда шаблон становится не нативным. Например для наследования нативно не получится написать шаблон, нужны классы, методы и тд… микро шаблонизатор, что-ли.
В итоге получалась какая-то копипаста из шаблонов Fenom, там и так все просто до непреличия
Код шаблона Fenom
<?php 
/** Fenom template 'foreach/smarty.tpl' compiled at 2013-07-04 01:43:57 */
return new Fenom\Render($fenom, function ($tpl) {
?><h1>Вывод 10 полей из 1000 элементов в цикле</h1>
<?php
/* foreach/smarty.tpl:2: {foreach $array as $item} */
  if($tpl["array"]) {  foreach($tpl["array"] as $tpl["item"]) {  ?>

<?php
/* foreach/smarty.tpl:3: {$item.id} */
 echo $tpl["item"]["id"]; ?>
 <?php
/* foreach/smarty.tpl:3: {$item.title} */
 echo $tpl["item"]["title"]; ?>
 <?php
/* foreach/smarty.tpl:3: {$item.var1} */
 echo $tpl["item"]["var1"]; ?>
 <?php
/* foreach/smarty.tpl:3: {$item.var2} */
 echo $tpl["item"]["var2"]; ?>
 <?php
/* foreach/smarty.tpl:3: {$item.var3} */
 echo $tpl["item"]["var3"]; ?>
 <?php
/* foreach/smarty.tpl:3: {$item.var4} */
 echo $tpl["item"]["var4"]; ?>
 <?php
/* foreach/smarty.tpl:3: {$item.var5} */
 echo $tpl["item"]["var5"]; ?>
 <?php
/* foreach/smarty.tpl:3: {$item.var6} */
 echo $tpl["item"]["var6"]; ?>
 <?php
/* foreach/smarty.tpl:3: {$item.var5} */
 echo $tpl["item"]["var5"]; ?>
 <?php
/* foreach/smarty.tpl:3: {$item.var6} */
 echo $tpl["item"]["var6"]; ?>
 
<?php
/* foreach/smarty.tpl:4: {/foreach} */
   } } ?>
<?php
}, array (
  'options' => 0,
  'provider' => false,
  'name' => 'foreach/smarty.tpl',
  'base_name' => 'foreach/smarty.tpl',
  'time' => 1369074113,
  'depends' => 
  array (
  ),
));


Ну да, я имел ввиду что false это тоже что-то, в отличии от null и хпх пытается превратить это в массив что бы посчитать. Немного криво, согласен, но логика ясна хотя бы
use count((array)$any_data)
Помню у меня была касета с хакнутой версией элиты, там была куча денег и крутой корабль начинающееся с планеты Maa вроде

Information

Rating
5,391-st
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Date of birth
Registered
Activity

Specialization

Backend Developer, Software Architect
Lead
Golang
PHP
MySQL
MongoDB
Redis
Git
SQL