Les connexions à la base de données CodeIgniter ne sont pas fermées
j'ai construit un site de communauté sociale à CodeIgniter qui reçoit maintenant un peu de trafic, la société d'hébergement ont commencé à se plaindre et dire que la base de données reçoit des connexions nulles ainsi que des connexions qui ne sont pas fermées.
Je ne suis pas tout à fait sûr de ce qu'est une requête nulle ou comment on finirait par être émis, des idées?
j'ai ajouté du code supplémentaire pour forcer les connexions lorsque le code atteint une fin mais apparemment ceci n'est-ce pas de travail.
quelqu'un peut-il proposer des suggestions quant à l'endroit où regarder ou commencer à déboguer un problème comme celui-ci?
Merci
j'ai le texte suivant dans le fond de mon cœur MY_Controller
public function __destruct() {
$this->db->close();
}
6 réponses
je pense que vous avez des problèmes avec les configurations initiales de la base de données de connexion Codeigniter.
à cette page, vous pouvez voir chaque valeur de la configuration array:
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;
ceci c'est une base de données de configuration de tableau de base, essayez de mettre la variable de pconnect à FALSE, quand elle est activée, le système ne ferme aucune connexion et il reste ouvert aux nouvelles les requêtes à tout moment.
si vous le définissez à false comme je l'ai dit, votre système continuera à fonctionner parfaitement, mais le codeigniter fermera et ouvrira la connexion quand il aura besoin d'utiliser la base de données.
ici, vous pouvez trouver et poster à l'intérieur du forum codeigniter avec un gars qui a un problème avec les variables pconnect, peut vous aider! http://codeigniter.com/forums/viewthread/177573/#842016
Codeigniter devrait automatiquement fermer la connexion à la base de données mais vous pouvez implicitement l'appeler avec $this->db->close();
voir http://codeigniter.com/user_guide/database/connecting.html
avez-vous essayé de faire $this->db->close();
après une interrogation?
J'ai eu des problèmes similaires avec CodeIgniter dans le passé et ils ont été causés par des connexions persistantes dans MySQL qui est activé par défaut dans CodeIgniter. J'ai utilisé le SHOW PROCESSLIST
requête dans MySQL pour voir les connexions ouvertes, leur requête courante, le temps (en secondes) pendant lequel la connexion a été ouverte, etc. Si la connexion est inactive Command
champ retourné contiendra Sleep
et Info
champ (la requête) serait NULL
ce qui est probablement ce que votre hôte se réfère. C'est un bon endroit pour commencer avec une question comme ça.
une autre chose que je veux noter est une nuance de PHP,mysql_close
qui est appelé ici à partir de votre contrôleur __destruct
la méthode ne fermera pas une connexion MySQL persistante. PHP fermera les connexions non-persistantes à la fin de l'exécution du script, donc il n'est 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 comme ça que je suis allé A propos du débogage de mon problème qui ressemble beaucoup à votre problème.
j'ai eu ce même problème il y a quelque temps, et la solution était multi-pièces (aucune partie du problème n'est apparue jusqu'à ce que toutes les parties deviennent problématiques ensemble). PConnect doit être éteint, sauf si vous savez comment l'utiliser (comme d'autres l'ont dit).
une autre chose à considérer est de savoir si votre serveur web est threadé (comme le mode worker D'Apache--la plupart des serveurs web le sont). Si vous recevez beaucoup de trafic, et vos fils ne se ferment pas rapidement, vous pourriez frapper certains concurrents les limites de connexion des serveurs web / bases de données ou l'épuisement des ressources mémoire/processeur. Cela pourrait causer des connexions de base de données à accrocher.
donc, je vérifierais les autres signes du problème, et ne supposerais pas que la base de données est la source. Il pourrait très bien être un symptôme. Avez-vous des informations sur les connexions null (comme quel utilisateur de la base de données les a générées)? Ça pourrait vous aider à le retracer...
Edit: une chose que j'ai oubliée -- parfois des erreurs PHP peut faire foirer les opérations de destruction de CI (qui ferment automatiquement les connexions, d'après ce que j'ai compris), donc vous pouvez vérifier vos journaux d'erreurs aussi.
j'ai résolu le même problème sur un site de CI en changeant le pilote 'mysql' en 'mysqli' dans: La base de données.php:
$db['default']['dbdriver'] = "mysqli";