вторник, 13 ноября 2012 г.

Yii: динамическое отключение профилирования заросов

Столкнулся в Yii с проблемами выделения памяти процессам, в которых осуществляется большое (измеряемое десятками тысяч) количество запросов к базе данных.

При включенном профилировании каждый запрос попадает в лог профайлера (а порой и не одного). При этом лог не очищается, пока процесс не будет завершен. В результате с каждым запросом увеличивается количество памяти, потребляемое приложением и в итоге мы вылетаем с ошибкой выделения памяти

Чтобы побороть это дело, не отключая профайлинг в принципе (например, через конфиги), можно сделать такой финт ушами:

function dummyFunction(){
 //выключаем все используемые логроуты в начале
 foreach(Yii::app()->log->routes as $route){
  $route->enabled = false;
 }

 //цикл, в котором происходят многочисленные обращения к БД.
 foreach(.....){
  ......
 }

 //включаем логроуты обратно
 foreach(Yii::app()->log->routes as $route){
  $route->enabled = true;
 }
}
По идее, можно отключать только те логроуты, что профилируют запросы, но использованное упрощение в моем случае оказалось вполне допустимо.

Комментариев нет:

Отправить комментарий

Напишите что-нибудь по теме