Соединения с базой данных CodeIgniter не закрываются - PullRequest
23 голосов
/ 24 августа 2011

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

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

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

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

Спасибо

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

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

Ответы [ 6 ]

26 голосов
/ 08 сентября 2011

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

На этой странице вы можете увидеть каждое значение из массива конфигурации:
https://www.codeigniter.com/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

6 голосов
/ 24 августа 2011

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

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

2 голосов
/ 24 августа 2011

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

1 голос
/ 17 ноября 2011

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

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

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

0 голосов
/ 06 января 2015

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

$db['default']['dbdriver'] = "mysqli";
0 голосов
/ 16 ноября 2011

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

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

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

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

...