10 10 Codeigniter Blog. Step7: Template+Benchmark+Cache. Game over. Codeigniter Blog. Step7: Template+Benchmark+Cache. Game over. От внешнего вида  кода c мешаниной из HTML и php/asp/#c/etc меня тошнит. Хотя дело вкуса. Некоторым нравится. Лозунги "PHP - лучший темплейтор", "Visual Studio думает за вас", "Зато Template Имярек очень гибкий!" имеют право на существование. Но поскольку я не разделяю этот лозунг, я все-таки приляпаю к блогу библиотеку темплейтов CodeIgniter. Кстати, в Wiki Codeigniter приведены примеры как можно привинтить к нему сторонние библиотеки в количестве четырех штук, а в форуме встречаются указания на применение в CI любимого народом Smarty. 

Впрочем, любая библиотека темплейтов, хоть частично и позволяет разделять представление от данных, все равно по сути является паллиативом (Паллиативное лечение - помощь направленное на облегчение состояния пациента, чьё заболевание не поддаётся лечению).  Идинственное что может спасти верстальщика от  напастей из звернца php-шаблонизаторов - XSLT, но это отдельная тема и с ней будем разбираться позже.

1.

До того как подключим темплейты к Codeigniter. Подключим библиотеку Benchmark которая помогает отслеживать узкие места в проектировании. Нам это нужно чтобы засечь насколько увеличилось время генерации страниц с темплейтами и без них.  Как обычно открываем контроллер блога. /system/application/controller/blog.php и вставляем в его консруктор строку, отмечающую время начала работы. 

     function Blog()
     {
       parent::Controller();
       $this->   load->   library('session');
       $this->   benchmark->   mark('code_start');
       $this->   load->   helper('url');
       $this->   load->   helper('form');
       $this->   load->   library('session');
       $this->   load->   library('pagination');
      }

Добавляем в конце вьюера блога /system/application/views/blog_view.php строку, котрая выведет время затраченное на генерацию страницы:

$this-> benchmark-> mark('code_end');
echo "<p> Time generation: ".$this-> benchmark-> elapsed_time('code_start', 'code_end').'"</p> ';

Запускаем страницу нашего блога в броузере и засекаем время. У меня машинка дохленькая. Время генерации страницы 0.02 секунды.

2.

Модифицируем выдачу данных для вьюера в контроллере блога:

     function index()
     {
       ...........................................................
       ...........................................................
       ...........................................................
        $from=intval($this->   uri->   segment(3));
        $this->   db->   limit(10,$from);
        $this->   db->   orderby("id", "desc");
        $query=$this->   db->   get('records');
        $data['blog_entries'] = $query->   result_array();
        $this->   parser->   parse('blog_view_teplate',$data);
     }

3.

Создаем новый вьюер /system/application/views/blog_view_teplate.php. Обращаем внимание, что он имеет расширение php. А это значит, что в него при необходимости добавить кучку PHP (за что боролиcь?)

<html>  
<body>  
{blog_entries} <!-- Здесь отрабатывается цикл по записям -->   
<h1>   {title}</h1>   
<p>   {body}</p>   
<p>   <a href="http://ci/blog/comments/{id}">   more...</a>   </p>   
{/blog_entries} <!-- Здесь заканчивается цикл по записям -->   
{pager}
</body>   
</html>  

Запускаем страницу нашего блога  и радуемся. Ку!

4.

Подкладываем в новый вьюер какашку в виде Benchmark

.........................................................................
........................................................................
{pager}
<?
$this->   benchmark->   mark('code_end');
echo "<p align='right'>    Time generation: ".$this->   benchmark->   elapsed_time('code_start', 'code_end')."</p>   ";
?>   
</body>   
</html>  

Запускаем страницу нашего блога   и обнаруживаем что время генерации страницы увеличилось на одну милисекунду. В принципе это на уровне стат.погрешности и можно было бы не принимать во внимание. Но блог рано или поздно нарастет функционалом и время генерации контента станет критическим. Поэтому неплохо было бы задуматься о кэшировании страниц.

5.

Кэш? Codeigniter думает за вас! (с).  Кэширование в нем есть  (кстати, есть еще и кэширование SQL-запросов). Не такое развитое как в других фреймворках, но все же оно предусмотрено. Достаточно вставить в самом начале функции контроллера, отвечающей за вывод информации строку: 
$this-> output-> cache(N);  
и Codeigniter  позаботится о кэшировании страницы на N минут. Можно попробовать и добавить  в  /system/application/controller/blog.php - там где функция вывода комментарие в блоге:

     function comments()
     {
         $this->   output->   cache(600);
         ..............................................
         ..............................................
         ..............................................

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

6.

Алгоритм управления кэшем простой:

  • Необходимо вести время обновления кэша для конкретной страницы в БД. 
    для этого  добавляем в таблицу записей records поле date
    ALTER TABLE records ADD date INT NOT NULL ; 
  • После добавления комментария к записи обнуляем  время обновления кэша (контроллер блога  /system/application/controller/blog.php)

      function comment_add()
          {
                // сбрасываем кэш
                $this->   db->   where('id', $_POST['record_id']);
                $this->   db->   update('records', array('date'=>   0));
                $this->   db->   insert('comments',$_POST); 
                redirect('blog/comments/'.$_POST['record_id']); 
          }
  • Перед вызовом страницы считываем время обновления кэша в переменную, например $cachetime;
    выставляем время кэша в БД равным ваньсуй или вань-ваньсуй (очень много);
    вызываем  кэш со временем $cashetime
    function comments()
     {
            $id=$this->   uri->   segment(3);
           // определяем необходимость кэширования
           $query = $this->   db->   query('SELECT date FROM records WHERE id='.$id);
           $cachetime = $query->   first_row()->   date;
           $this->   db->   where('id', $id);
           // устанавливаем кэш в  ваньсуй
           $this->   db->   update('records', array('date'=>   99999999));
           $this->   output->   cache($cachetime);
           $id=$this->   uri->   segment(3); // получаем номер записи блога из URL
           .......................................................................
           .......................................................................
           .......................................................................
          ........................................................................
     }
  • Берем на заметку, что для полноценного кэширования необходимо прилепить еще обработку  Last-Modified 

7. Game over

Все что получилось складываем в архивную директорию step7. На этом объявляем работу с учебным блогом закрытой.

P.S.

Первая редакция сайта, который вы читаете,  выросла из этого цикла статей. Доработки были минимальными и касались только безопасности, о которой я практически ничего не писал.  Вторая редакция была более проработана и движок был полностью переписан на XSLT. Исходный XML любой страницы можно получить если прибавить к адресу суффикс "~xml". Например http://erum.nu/article/10~xml

]]>
03 September 2008 2008-09-03 11:02:31 0 0 0 15 1
Сodeigniter Шаг за Шагом codeigniter-blog 10 CodeIgniter 2 codeigniter 10 Codeigniter Blog. Step7: Template+Benchmark+Cache. Game over. Codeigniter Blog. Step7: Template+Benchmark+Cache. Game over. Влияние метатега Keywords - вечно живая SEO-легенда 11 11 Codeigniter Step0: Собираем стенд для дальнейших экспериментов. 12 12 04-08-2010 erum.ru Исаак Тынгылчав Кстати также как и в продолждении разработок на CodeIgnite. Имхо, он хорош только для первоначального изучения php-фреймворков.]]> 549 548 0 04-08-2010 Александр Было бы интересно.]]> 548 0 0 01-08-2010 5nicca Статьи понравились.]]> 547 0 0 21-07-2010 levik.info Levik 539 0 0 18-05-2010 lenauto.ru Вадим хотелось бы услышать ваш совет,
с выбором методов многоуровневого хранения данных на сайте.
заранее не могу предвидеть проблем, по этому прошу помощи.
к примеру сайт 10 тыс страниц.
вложенность разделов различная.
не говоря уже о коментариях..
подскажите где найти информацию о подходах структуры проектов?]]>
514 0 0
07-04-2010 йййй 493 73 0 17-01-2010 miay78.hut1.ru Александр 425 0 0 23-12-2009 erum.ru Исаак Тынгылчав И потом зачем? Для чистоты концепции?
Статья старая написана давно. С тех пор появилась куча аналогичных,более грамотных.
Да и фремворк пояаились получше. Сейчас бы я не CI взял бы, а УЙ.]]>
416 415 0
23-12-2009 blog.gtalex.ru/ GTAlex 415 0 0 05-12-2009 erum.ru Исаак Тынгылчав Если бы я сделал как положено - все по MVC, пример был бы идеологически более правильным, но менее понятным. Мне так кажется. Да и сам на простеньких сайтах обхожусь без моделей.
Но модели я рассматривал в этом же блоге, но уже в другом цикле. Цикл правда остался незаконченным за ненадобностью - после этой публикации стало появляться очень много материалов по CI на русском языке. К тому же я не считаю себя большим специалистом по PHP.]]>
392 391 0
05-12-2009 Андрей А что бы изменилось если бы вы использовали ещё и модели?
Я так понимаю что частично то, что должна делать модель у вас делал контроллер.
Что должно выполняться в модели конкретно в вашем примере?
Спасибо!]]>
391 0 0
16-11-2009 Витя 362 0 0 29-09-2009 video-mania.org.ua Алекс 342 0 0 02-07-2009 ROMAHi4 function Blog()
{
..
$this->load->library('parser');
..
}]]>
325 0 0
27-05-2009 www.iskra.md isi999 $autoload['libraries'] = array('database', 'session','pagination');и т.д.
$autoload['helper'] = array('url','form', 'editor'); и т.д.
Зачем их 2-ой раз грузить в конструкторах blog и admin?
$this->load->helper('url');
$this->load->helper('form');
$this->load->library('session')
получается лишний код.]]>
288 0 0
20-04-2009 erum.ru Исаак Тынгылчав Сейчас я в проектах использую библиотеку кэширования от Zend Framework. У нее намного больше возможностей.]]> 271 223 0 17-04-2009 ehoes.net Белишев Денис aka ehoes 269 0 0 18-01-2009 cpu.homeunix.net Summoner Ведь при первой же вызове comments()будет создан кеш на очень большой промежуток времени и до истечения этого времени функция comments обрабатываться небудет следовательно новые добавленые комментарии тоже небудут отображать]]> 223 0 0 13-09-2008 erum.ru Исаак Тынгылчав 95 33 0 03-09-2008 Исаак Тынгылчав Но я вряд ли бы смог написать статью для Вашего замечательного журнала. Я не программист. А это все - так, баловство.]]> 76 17 0 03-09-2008 Исаак Тынгылчав 75 16 0 03-09-2008 Исаак Тынгылчав Да и вообще. Если речь идет об оптимизации кэширования и больших нагрузках, м.б. и не стоит CodeIgniter трогать?]]> 74 18 0 03-09-2008 Исаак Тынгылчав 73 10 0 02-03-2008 _ci ps. да, я такой. ( for by pass lokanichny :) )]]> 33 0 0 02-03-2008 Андрей 32 0 0 23-01-2008 книжка Packt Publishing | ISBN-10: 1847191746 | July 31, 2007 | 260 pages | PDF | 1.9MB
http://dl.hayfilm.eu/index.php"name=News&op=article&sid=38
(Подушка против транслита)]]>
22 0 0
17-01-2008 melik 19 0 0 19-12-2007 dfk 18 0 0 13-12-2007 nw Не будет ли у вас желания опубликовать эти статьи на тему CodeIgniter в следующем PHP Inside (phpinside.ru)" Номер как раз планируем посвятить этому замечательному фреймворку.
Если это будет интересно, напишите плз nw AT phpinside.ru]]>
17 0 0
28-11-2007 newnoob При таком коде, как мне обработать к примеру title. Допустим мне нужно сделать что бы title проходил через функцию транслита, без foreach не обойтись"]]> 16 0 0 15-11-2007 buddax2 $this->load->library("parser");
блин, пока понял в чем дело... думал капец, я тупой...]]>
14 0 0
10-11-2007 Timur Хотелось бы продолжение:)]]> 13 0 0 23-10-2007 marazmus 11 0 0 19-10-2007 ruFog (http://eterniya.ru) (Подушка против "вы очень лаконичны")]]> 10 0 0