Впрочем, любая библиотека темплейтов, хоть частично и позволяет разделять представление от данных, все равно по сути является паллиативом (Паллиативное лечение - помощь направленное на облегчение
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
]]>