Kohana. Ускоряем ORM

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

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

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

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

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

_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: Понятно это нужно делать в конце, когда разработка завершена и структура БД уже не будет меняться

Kohana. Ускоряем ORM: 7 комментариев

  1. Дмитрий

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

    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;
    }

  2. Дмитрий

    Забыл =)

    protected static $_cache_lifetime = 2592000;

  3. Altesack

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

  4. Уведомление: Kohana 3.0. Мысли о том как надо писать модели. « Блог о CMS

  5. Максим

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

  6. Алексей

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

Комментарии запрещены.