web-dev-qa-db-fra.com

Les connexions à la base de données CodeIgniter ne sont pas fermées

J'ai construit un site Web de communauté sociale dans CodeIgniter qui génère actuellement pas mal de trafic. La société d'hébergement a commencé à se plaindre en disant que la base de données recevait des connexions nulles ainsi que des connexions non fermées.

Je ne suis pas tout à fait sûr de ce qu'est une requête nulle ou comment on finit par être émis, des idées?

J'ai ajouté du code supplémentaire pour forcer les connexions étroites lorsque le code atteint une fin, mais apparemment cela ne fonctionne pas.

Quelqu'un peut-il offrir des suggestions quant à savoir où chercher ou commencer à déboguer un problème de ce type?

Merci

J'ai les éléments suivants au bas de mon noyau MY_Controller

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

Je pense que vous rencontrez des problèmes avec les configurations initiales de la base de données de connexion Codeigniter.

Sur cette page, vous pouvez voir chaque valeur du tableau config:
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;

Ceci est une base de données de configuration de tableau de base, essayez de définir la variable pconnect sur FALSE. Lorsqu'il est activé, le système ne ferme aucune connexion et reste ouvert aux requêtes de nouvelles à tout moment.

Si vous le définissez sur false comme je l'ai dit, votre système continuera de fonctionner parfaitement, mais codeigniter fermera et ouvrira la connexion lorsqu'il aura besoin d'utiliser la base de données.

Ici, vous pouvez trouver et poster dans le forum codeigniter un gars qui a un problème avec les variables pconnect, peut vous aider! http://codeigniter.com/forums/viewthread/177573/#842016

26
Wallysson Nunes

Codeigniter devrait fermer automatiquement la connexion à la base de données mais vous pouvez l'appeler implicitement avec $this->db->close();

Voir http://codeigniter.com/user_guide/database/connecting.html

6
simnom

avez-vous essayé de faire $this->db->close(); après une requête?

2
Marco Monteiro

J'ai eu des problèmes similaires avec CodeIgniter dans le passé et ils étaient causés par des connexions persistantes dans MySQL, activées par défaut dans CodeIgniter. J'ai utilisé la requête SHOW PROCESSLIST dans MySQL pour afficher les connexions ouvertes, la requête en cours d'exécution, le temps (en secondes) d'ouverture de la connexion, etc. Si la connexion est inactive, le champ Command renvoyé contiendrait Sleep et le champ Info (la requête) serait NULL, ce à quoi votre hôte fait probablement référence. C'est un bon endroit pour commencer avec un problème comme celui-ci.

Une autre chose que je veux noter est une nuance de PHP, mysql_close qui est appelée ici depuis la méthode __destruct de votre contrôleur ne fermera pas une connexion persistante à MySQL. PHP fermera les connexions non persistantes à la fin de l'exécution du script; il n'est donc généralement pas nécessaire de l'appeler.

Je me rends compte que vous aviez dit que les connexions persistantes n’étaient pas activées, c’est ainsi que j’ai procédé pour déboguer mon problème, ce qui ressemble beaucoup à votre problème. 

1
Matt Barry

J'ai résolu le même problème sur un site CI en remplaçant le pilote 'mysql' par 'mysqli' dans:

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

J'ai eu le même problème il y a quelque temps, et la solution était composée de plusieurs parties (aucune partie du problème ne s'est manifestée tant que toutes les parties ne sont pas devenues problématiques ensemble). PConnect devrait être éteint à moins que vous ne sachiez l'utiliser (comme d'autres l'ont déjà dit).

Une autre chose à considérer est de savoir si votre serveur Web est threadé (tel que le mode de travail d'Apache - la plupart des serveurs Web le sont). Si vous obtenez beaucoup de trafic et que vos threads ne se ferment pas rapidement, il est possible que vous respectiez certaines limites de connexion simultanée serveur Web/serveur de base de données ou que vous utilisiez trop de ressources mémoire/processeur. Cela pourrait entraîner le blocage de certaines connexions à la base de données.

Donc, je rechercherais d’autres signes du problème sans supposer que la base de données est la source. Cela pourrait très bien être un symptôme. Avez-vous des informations sur les connexions nulles (comme quel utilisateur de base de données les a engendrées)? Cela pourrait vous aider à le retrouver ...

Edit: Une chose que j'ai oubliée - parfois, des erreurs PHP peuvent gâcher les opérations de destruction de CI (qui ferment automatiquement les connexions, à ma connaissance), vous pouvez donc consulter vos journaux d'erreurs.

0
landons