Kohana. Ускоряем ORM



kohanaШтатный ORM у Kohana практически на каждое шевеление создаёт запрос “SHOW CREATE TABLE blablabla“.

Я как-то не придавал этому значения раньше, но похоже этот запрос довольно ёмкий по времени, у меня он почему-то занимает до пол-секунды в плохую погоду (погода зависит от текущей загрузки хостинга). А если страница пестрит обращениями к БД, которые делаются через ORM, то ждите того, что треть запросов будет именно “SHOW CREATE TABLE“.

Как бы сделать так, чтобы ORM так не делал? Ведь структура таблиц работающего сайта практически не меняется годами!

Решение простое! Нужно немного переопределить метод list_columns класса ORM так, чтобы он кешировал структуру таблицы и дважды не бегать.

Для этого нужно в папке application/classes создать файл orm.php с примерно сдедующим содержанием:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
class ORM extends Kohana_ORM
{
public function list_columns()
{
    $cache_lifetime=360000; // 100 часов
    $cache_key = $this->_table_name ."structure";
    if ($result = Kohana::cache($cache_key, NULL, $cache_lifetime)) {
        $_columns_data = $result;
    }
 
 
    if( !isset($_columns_data)) {
        $_columns_data = $this->_db->list_columns($this->_table_name);
        Kohana::cache($cache_key, $_columns_data, $cache_lifetime);
    }
 
    return $_columns_data;
}
} 
 
?>

Кстати это не я такой умный. Идею решения я нагуглил, хотя и немного переделал.

UPD: Понятно это нужно делать в конце, когда разработка завершена и структура БД уже не будет меняться

Посты по теме:

  1. Модуль AUTH в Kohana
  2. Модули в Kohana и CodeIgniter
  3. Kohana. Query Builder. Правила хорошего тона.
  4. Kohana для чайников. Простейший ORM
  5. Kohana для чайников. Файловая структура, или история одной ошибки.

Категории Kohana |
автор: altesack / Среда, Май 04, 2011 / 7 комментов »

7 комментов

    Достаточно вручную заполнить свойство $_table_columns в модели.

    Будет ли у Вас дополняться кэш? Использую следующее отточенное решение:

    public function reload_columns($force = FALSE)
    {
    if (Kohana::$caching and empty(ORM::$_column_cache))
    {
    // Пробуем загрузить информацию о полях таблицы из кэша
    $column_cache = Kohana::cache(’ORM::$_column_cache’, NULL, ORM::$_cache_lifetime);
    if ($column_cache)
    {
    ORM::$_column_cache = $column_cache;
    }
    }

    if ($force === TRUE or empty($this->_table_columns))
    {
    if (isset(ORM::$_column_cache[$this->_object_name]))
    {
    // Use cached column information
    $this->_table_columns = ORM::$_column_cache[$this->_object_name];
    }
    else
    {
    // Grab column information from database
    $this->_table_columns = $this->list_columns(TRUE);

    // Load column cache
    ORM::$_column_cache[$this->_object_name] = $this->_table_columns;

    if (Kohana::$caching)
    {
    // Получаем кэш
    $column_cache = Kohana::cache(’ORM::$_column_cache’, NULL, ORM::$_cache_lifetime);

    // Дополняем кэш
    $column_cache = ($column_cache === NULL) ? ORM::$_column_cache : $column_cache + ORM::$_column_cache;

    // Пересохраняем кэш
    Kohana::cache(’ORM::$_column_cache’, $column_cache);
    }
    }
    }

    return $this;
    }

    Забыл =)

    protected static $_cache_lifetime = 2592000;

    @ biakaveron:
    Кстати, это было бы более правильным решением.
    Моё решение больше для ленивых.

    [...] 1. Перечень полей ========================= В модели обязательно должны быть описаны все поля таблицы. Подробнее проблема описана тут [...]

    Большое спасибо, за решение. Очень помогло чуток снизить загрузку. Правда использовал не файл-кеш, а мемкеш.

    исправление генокода не есть гуд
    вспомним ООП

Ответить