Очистка кеша запросов в CodeIgniter

Рано или поздно, вы можете столкнуться с задачей, когда нужно выполнить много запросов к базе данных в одном скрипте. У меня такая необходимость возникла при парсинге данных. Такой скрипт достаточно быстро остановиться с ошибкой PHP о том, что закончилась оперативная память.

Я видел в сети необосновонную критику фреймворка, что это утечки памяти. Попробуем разобраться, а почему так происходит, это ошибка, или что-то еще? Если внимательно изучить документацию к фреймворку, то ответ очевиден. В CodeIgniter есть встроенный механизм профилирования запросов к базе данных. Все запросы, выполняемые во время исполнения приложения, запоминаются фреймворком. Также, запоминается время их исполнения. Нетрудно догадаться, что запомнить текст всех запросов становиться ресурсоемкой операцией, когда их количество переваливает за сотню, а в подобных приложениях их количество может исчисляться миллионами.

Для решения этой задачи предлагаю воспользоваться следующей функцией:

[code] if (function_exists('clear_query_cache') === FALSE) { function clear_query_cache($db = FALSE) { // Получим основное подключение

    if ($db === FALSE)
    {
        $db = get_instance()->db;
    }   

    // Очистим кеш запросов.

    foreach($db->queries as $key => $value)
    {
        unset($db->queries[$key]);
    }

    // Очистим кеш времени выполнения запроса.

    foreach($db->query_times as $key => $value)
    {
        unset($db->query_times[$key]);
    }       
}

} [/code]

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

26.09.2010