.. / Codeigniter Blog. Step7: Template+Benchmark+Cache. Game over.

  1. codeigniter-blog

От внешнего вида  кода 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

  1. 2007-09-03
  2. codeigniter-blog
Go Index Test