Подтвердить что ты не робот

Соединения базы данных CodeIgniter не закрываются

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

Я не совсем уверен, что такое нулевой запрос или как он будет выпущен, любые идеи?

Я добавил дополнительный код, чтобы принудительно закрыть соединения, когда код достигнет конца, но, видимо, это не работает.

Может ли кто-нибудь предложить какие-либо предложения относительно того, где искать или начинать отлаживать такую ​​проблему?

Спасибо

У меня есть следующее в нижней части моего ядра MY_Controller

public function __destruct() {
    $this->db->close();
}
4b9b3361

Ответ 1

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

На этой странице вы можете увидеть каждое значение из массива config:
http://ellislab.com/codeigniter/user-guide/database/configuration.html

$db['default']['hostname'] = "localhost";
$db['default']['username'] = "root";
$db['default']['password'] = "";
$db['default']['database'] = "database_name";
$db['default']['dbdriver'] = "mysql";
$db['default']['dbprefix'] = "";
$db['default']['pconnect'] = TRUE;
$db['default']['db_debug'] = FALSE;
$db['default']['cache_on'] = FALSE;
$db['default']['cachedir'] = "";
$db['default']['char_set'] = "utf8";
$db['default']['dbcollat'] = "utf8_general_ci";
$db['default']['swap_pre'] = "";
$db['default']['autoinit'] = TRUE;
$db['default']['stricton'] = FALSE;

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

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

Здесь вы можете найти и опубликовать внутри форума codeigniter с парнем, у которого есть проблема с переменными pconnect, может вам помочь! http://codeigniter.com/forums/viewthread/177573/#842016

Ответ 2

Codeigniter должен автоматически закрыть соединение с базой данных, но вы можете неявно вызвать его с помощью $this->db->close();

См. http://codeigniter.com/user_guide/database/connecting.html

Ответ 3

пытались ли вы выполнить $this->db->close(); после запроса?

Ответ 4

У меня были аналогичные проблемы с CodeIgniter в прошлом, и они были вызваны постоянными соединениями в MySQL, который по умолчанию включен в CodeIgniter. Я использовал запрос SHOW PROCESSLIST в MySQL для просмотра открытых подключений, их текущего текущего запроса, времени (в секундах), для которого было открыто соединение, и т.д. Если соединение неактивно, то возвращаемое поле Command содержало бы Sleep и поле Info (запрос) будет NULL, что, вероятно, относится к вашему хосту. Это хорошее место, чтобы начать с такой проблемы.

Еще одна вещь, которую я хочу отметить, - это нюанс PHP, mysql_close, который называется здесь с вашего контроллера __destruct method не будет закрывать постоянное соединение MySQL. PHP закрывает непостоянные соединения в конце выполнения script, поэтому обычно не нужно его вызывать.

Я понимаю, что вы говорили, что постоянные подключения не были включены, вот как я начал отлаживать мою проблему, которая очень похожа на вашу проблему.

Ответ 5

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

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

Итак, я бы проверить другие признаки проблемы, и не предполагать, что база данных является источником. Это может быть симптом. У вас есть какая-либо информация о нулевых соединениях (например, какой пользователь базы данных их породил)? Это может помочь вам отследить его назад...

Изменить: Одна вещь, которую я забыл - иногда ошибки PHP могут испортить операции CI destruct (которые автоматически закрывают соединения, из моего понимания), поэтому вы также можете проверить свои журналы ошибок.

Ответ 6

Я решил такую ​​же проблему на одном сайте CI, изменив драйвер mysql на mysqli в: Database.php:

$db['default']['dbdriver'] = "mysqli";