Создание и сопровождение сайтов

Блог. Yii. Подсказки по yii. Глава седьмая.

Поиск

Советы по CMF Yii. Глава седьмая.

  1. Кэширование запросов.

    При кэшировании запроса его результат сохраняется в кэш и в дальшейшем берётся оттуда.

    Например, чтобы сохранять кэш в файл необходимо в config/main.php указать:

    1. 'cache'=>array(  
    2.     'class'=>'system.caching.CFileCache',  
    3. ),  

    Выставляем время кеша в 1000 секунд для DAO:

    1. $sql = 'SELECT field1, field2 FROM {{apartment_reference}}';  
    2. $dependency = new CDbCacheDependency('SELECT MAX(date_updated) FROM apartment_reference');  
    3. $apReference = Yii::app()->db->cache(1000, $dependency)->createCommand($sql)->queryAll();  

    То же самое для AR:

    1. $dependency = new CDbCacheDependency('SELECT MAX(date_updated) FROM apartment_reference');      
    2. $apReference = apReference::model()->cache(1000, $dependency)->findAll();     

    Для очистки всего кэша вызываем метод flush():

    1. Yii::app()->cache->flush();  

     

  2. Отладка SQL запросов.

    На мой взгляд самым добротным отладчиком для Yii является расширение yii-debug-toolbar.

    Если установить его нет возможности/необходимости/желания, а починить, например, падение sql запроса нужно.

    На помощь придёт логирование в FireBug/инструменты разработчика Google Chrome.

    Для этого в config/main.php нужны такие изменения:

    1. ...  
    2. 'db'=>array(  
    3.     ...  
    4.     'charset' => 'utf8',  
    5.     'enableParamLogging' => 0,  
    6.     'enableProfiling' => true,  
    7.     'schemaCachingDuration' => 0,  
    8.     ....  
    9. ),  
    10.   
    11. 'log'=>array(  
    12.     'class'=>'CLogRouter',  
    13.     'routes'=>array(  
    14.         array(  
    15.             'class'=>'CWebLogRoute',  
    16.             'levels'=>'trace',  
    17.             'showInFireBug'=>true,  
    18.         ),  
    19.     ),  
    20. ),  
    21. ...  

    В файле index.php раскомментировать строки: defined('YII_DEBUG') or define('YII_DEBUG',true); и defined('YII_TRACE_LEVEL') or define('YII_TRACE_LEVEL',3);

    1. // remove the following lines when in production mode  
    2. defined('YII_DEBUG'or define('YII_DEBUG',true);  
    3. // specify how many levels of call stack should be shown in each log message  
    4. defined('YII_TRACE_LEVEL'or define('YII_TRACE_LEVEL',3);  

    Вкладка "Консоль" в FireFox:

    logging ff small 

    Вкладка "Консоль" в Google Chrome:

    logging gh small 

    Запрос, созданный при помощи построителя запросов, можно посмотреть при помощи CDbCommand::getText().

    Например, имеем запрос:

    1. $sql = 'DELETE FROM {{apartment_reference}} WHERE apartment_id="'.$this->id.'"';  

    При вызове getText(), который позволяет посмотреть запрос, а не выполнить его.

    1. var_dump(Yii::app()->db->createCommand($sql)->text);  

    Получим при выводе:

    1. string(62) "DELETE FROM re_dev_apartment_reference WHERE apartment_id="37""   

    Для выполнения запроса используйте execute()

     

  3. Построитель запросов.

    В предыдущем примере вы увидели sql запрос на удаление (DELETE FROM {{apartment_reference}} WHERE ...)

    Это выглядит "не в стиле" Yii.

    Для тех кто не хочет использовать Active Record в Yii существует построитель запросов.

    С его помощью этот же запрос на удаление записи будет иметь вид:

    1. Yii::app()->db->createCommand()->delete('{{apartment_reference}}''apartment_id=:id'array(':id'=>$this->id));  

    Добавление строки в таблицу:

    1. INSERT INTO `apartment_reference` (`field1`, `field2`) VALUES ('valueField1''valueField2');  
    1. Yii::app()->db->createCommand()->insert('{{apartment_reference}}'array(  
    2.     'field1'=>'valueField1',  
    3.     'field2'=>'valueField2',  
    4. ));  

    Изменение значения с строке:

    1. UPDATE `apartment_reference` SET `field1`='valueField1' WHERE id='1';  
    1. Yii::app()->db->createCommand()->update('{{apartment_reference}}'array(  
    2.     'field1'=>'valueField1',  
    3. ), 'id=:id'array(':id'=>1));  

    Выборка данных:

    1. SELECT field1, field2 FROM `apartment_reference` WHERE id = '1';  
    1. $apReference = Yii::app()->db->createCommand()  
    2.   ->select('field1, field2')  
    3.   ->from('{{apartment_reference}}')  
    4.   ->where('id=:id'array(':id'=>1))  
    5.   ->queryRow();  

     

Обсудить статью на форуме