Kohana. Прописываем поля в модели. Автоматизация процесса

kohanaЕсли вы хотите ускорить ваш сайт на Kohana, то можете попробовать поковыряться в моделях. Дело в том что штатный ORM Kohana при каждом создании класса бежит уточнять структуру таблицы. Это выливается в кучу запросов вида:

SHOW FULL COLUMNS FROM `menus`

Я как-то писал об этом тут и тут.

Этого безобразия можно избежать, если явно указать в модели список полей. И, понятно, это стоит делать когда структура вашей базы более или менее стабилизируется.

И вот однажды я собрался ускорить сайт на заветные 10 милисекунд, как вдруг понял, что это неподъёмная ручная работа. Представьте только, если у вас полсотни таблиц с парой десятков полей каждая!

После того как я посидел три часа, сделав при этом ничтожную часть работы, да ещё и с ошибками, я плюнул и написал себе небольшого помощника. Вот он — этот код надо поместить в application/classes/orm.php.

table_name()}\n\r====================================\n\r";
    $_columns_data = $this->_db->list_columns($this->_table_name);
    $columns_str .= "protected \$_table_columns = array(\n\r";
    foreach ($_columns_data as $col_name => $col_prop){
	$columns_str .= "'$col_name' => array('type'=>'{$col_prop['type']}'),\n\r";
    }

    $columns_str .= ");\n\r\n\r\n\r\n\r";

    kohana::$log->add(LOG::ERROR, $columns_str );

    return $_columns_data;
}
}

?>


Как оно работает
=========================

При обращении к любой странице, где иcпользуется ORM c несформированным свойством $_table_columns этот файл выведет в лог ошибок коханы чистой готовый для вставки текст кода.

Это выглядит примерно так:


altesack# tail -f application/logs/2013/01/07.php
2013-01-07 22:33:49 --- ERROR:

====================================
 TABLE: roles
====================================
protected $_table_columns = array(
'id' => array('type'=>'int'),
'name' => array('type'=>'string'),
'description' => array('type'=>'string'),
);


2013-01-07 22:33:49 --- ERROR:

====================================
 TABLE: user_tokens
====================================
protected $_table_columns = array(
'id' => array('type'=>'int'),
'type' => array('type'=>'string'),
'user_id' => array('type'=>'int'),
'user_agent' => array('type'=>'string'),
'token' => array('type'=>'string'),
'created' => array('type'=>'int'),
'expires' => array('type'=>'int'),
);

Вот и всё. Осталось только пощёлкать по сайту, пройтись по разным страницам и набрать логов. При большом желании можно специально сделать контроллер с вызовом всех-всех моделей, но я так делать не буду =)

Kohana. Прописываем поля в модели. Автоматизация процесса: 5 комментариев

  1. Rpsl

    Тоже решал подобную проблему, только не с коханой, но смысл от этого не поменяется. Тоже пришел к мысли что код нужно генерировать автоматически, но решил ее развить через var_export().

    Если кртатко и про эту задачу, то после обращения к данным которых не существует ( описание таблицы ), сгененированный код клался в tmp папку в виде готовых php файлов, после чего он успешно падал в кэш apc и работал супер быстро. А на __destruct стояла проверка, что если этот файл живет слишком долго, либо произошли ошибки, то мы его на всякий случай удаляем и он переделывается при следующем заходе.

    Таким образом можно кэшировмать много редко меняющихся структур, типо описания таблиц или дерева связей..

  2. altesack Автор записи

    Я делал кеширование структуры таблицы в файл. Выигрыш небольшой. Я так понимаю, что время на поиск нужного куска в кеше, почти всё съедает. Более того, в самый первый момент, когда создаётся кеш, всё работает даже немного медленнее.

    Поэтому я пришёл к прописыванию структуры прямо в модель.

  3. aktuba

    Не понимаю я подобного… Ну хотите ускорить — откажитесь вообще от ORM. Plain-sql и понятнее, и работает быстрее, и оптимизировать проще.

  4. amberlex

    > Ну хотите ускорить – откажитесь вообще от ORM.
    Обычный запрос ORM — 0.000242 s

  5. aktuba

    @ amberlex: это к чему? У меня на локали обычный sql-запрос 0.00001 сек, Вам это что-то дало?)

    Хотите увидеть тормоза: сделайте пару десятков сложных запросов, с 3-5 джойнами, сложными условиями и пр… На моих тестах разница до 300%.

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