10
votes

Comment utiliser la connexion persistante de PDO?

J'ai le code suivant et j'ai raferré cette page Web dans Firefox pendant 5 fois, alors le MySQL m'a montré 5 connexions. Selon le manuel PDO,

Les connexions persistantes ne sont pas fermées à la fin du script, mais sont mis en cache et réutilisé lorsqu'un autre script demande une connexion en utilisant le même crédits. La connexion persistante Le cache vous permet d'éviter les frais généraux d'établir une nouvelle connexion chaque temps un script doit parler à un base de données, entraînant une bande plus rapide Application.

J'ai utilisé les mêmes informations d'identification, mais le nombre de connexions MySQL continue de continuer à augmenter. Même essayer de fermer la connexion avec dB = null n'a pas pu fermer les connexions. Quel est le problème de mon code? xxx


5 commentaires

Ce qui n'a pas fonctionné"? fermeture de la connexion ou enlever la persistance?


php.net/manual/fr/pdo.Connections.php look à la dernière note. Est-ce que cela peut être la situation pour vous?


Quelle est la méthode que vous avez appliquée pour obtenir le numéro de connexion? Afficher la liste des processus ou?


Où sont réellement ces connexions cached ??? Cela fonctionne même si vous n'avez pas de mécanisme de mise en cache en place?


Il semble que vous ayez besoin de fermer le curseur et d'attribuer NULL au dernier objet de la déclaration également pour fermer la connexion.


3 Réponses :


0
votes

De ce que je sais de la connexion persistante, vous n'en avez probablement pas besoin:

  1. Vous êtes sur localhost, de sorte que la connexion est très rapide et que vous économiserez beaucoup de la mise en cache de votre connexion
  2. en raison du principal sous-jacent d'Apache, vous avez de nombreux threads qui répondent à la demande du client et que la connexion est persistante dans un seul thread, non partagée sur chacun d'eux pour que votre nombre de connexion soit disponible. up dans mysql jusqu'à ce qu'il soit atteint le fillimit d'Apache
  3. Il y a quelques risques que la connexion persistante cause un problème à votre application dans le type de DBLOCK ou NABLOCK

    Vous voulez maintenant faire un peu plus de recherches sur les connexions persistantes si vous pensez toujours que vous en avez vraiment besoin


6 commentaires

Raisons de la Downvote: Il n'est pas pertinent si quelqu'un est sur localhost ou non. Les connexions non persistantes dépensent des descripteurs de fichiers. Les connexions non persistantes initient la poignée de main de connexion sur chaque demande HTTP. 2) Apache ou Nginx persistent la connexion par thread et exécutent la poignée de main une fois - cela signifie que chaque demande suivante ne doit pas pour passer à travers ce surcharge. C'est ce que vous voulez . La raison pour laquelle les connexions montent est que Apache est un logiciel vraiment écrit qui ne peut pas nettoyer correctement. 3) wtf ?! Vous venez de supprimer une déclaration aléatoire avec 0 faits.


@Mjh merci, au moins je peux comprendre pourquoi il est bullevé, alors que je ne pouvais pas sans commentaire


La réponse peut être améliorée et modifiée, auquel cas vous aurez mon uppote et je vous suggère d'ajouter quelques bits d'information supplémentaires à ce sujet. Le problème est que rien n'est noir et blanc, les connexions persistantes ont leur utilisation, non persistantes. Les connexions persistantes sont mieux utilisées avec php-fpm , tandis que non persistant doit être utilisé avec Apache et mod_php car Apache a tendance à bousiller le contraire. Les applications FastCGI telles que PHP-FPM sont rapides (ER) en raison de connexions persistantes, non seulement vers MySQL.


Je dois juste rafraîchir mon esprit, je n'ai pas travaillé à ce niveau pendant quelques années. Entre temps pour les personnes à la recherche de ce sujet, cela exprime la partie principale de ma réponse Stackoverflow.com/Questtions/50303/...


Eh bien que la réponse a 8 ans maintenant, et ce n'est même pas correct. Les gens lisent généralement ce qu'ils veulent être vrais et uppotes, sans prendre en compte les faits. De nos jours, les applications sont bien construites et avec plus d'esprit à l'esprit. Si vous utilisez une application rapide, vous utiliserez une connexion persistante car il est toujours plus rapide de se connecter une fois au lieu de vous connecter / déconnecter sur chaque demande (qui violent réellement la DB et tue la performance).


bien celui-ci avait 4 ans



2
votes

Cette question est très ancienne mais ce sera correct si je contribue. Je pense que vous devez implémenter une classe Singleton pour la manutention des connexions de base de données, je vais écrire un exemple de classe ci-dessous ..

<?php 
$dbh = DB::connect();

foreach ($dbh->query('SELECT * from agent') as $row){ 
  print_r($row);
}
?>


10 commentaires

Alors, qu'avez-vous contribué? Vous venez de créer un singleton sans expliquer pourquoi ni avez-vous abordé sur le sujet de la connexion persistante. À quoi aide votre code? Savez-vous quelles sont les connexions persistantes, pourquoi elles sont utilisées et comment Singleton aide-t-elle avec cela?


@Mjh je suis je me trompe ou tu as descendu la mauvaise réponse?


@MJH Je sais quelle connexion persistante est, outre j'ai ajouté un soutien persistant à la classe, et plus encore, de la connexion persistante et de la classe singleton tous les vigueurs à l'évolutivité, nous sommes ici pour nous aider avec le meilleur et ce qui pourrait aider les autres, à nouveau, Les codes ont été expliqués, c'est j'ai commenté les codes, merci


@JonaCloutier - Je n'ai pas abouti à la mauvaise réponse. J'ai bownvoché le vôtre parce que vous ne savez pas quelle connexion persistante est, vous avez supposé OP utilise Apache et vous avez fourni une mauvaise réponse. Aucune infraction signifiait.


@razzbee - Vous avez implémenté un singleton pour la manipulation de la connexion de la base de données dans l'application. Vous n'avez pas expliqué pourquoi cela résout le problème que OP a. Vous n'avez pas mentionné ce qu'est une connexion persistante et comment votre classe aide le problème. Je n'ai pas voté sur votre réponse parce que c'est incomplet. Déposer du code sans expliquer pourquoi c'est utile n'est pas vraiment utile, n'est-ce pas?


@Mjh, je reçois ton point .. fera de mon mieux pour expliquer mes codes la prochaine fois, d'ailleurs, je pensais que les commentaires aideraient


Il suffit de mettre à jour la réponse avec une explication et c'est tout, ce n'est pas une mauvaise réponse en soi :)


Indépendamment de la question de savoir si cette réponse a répondu que j'ai trouvé cela utile, merci.


J'ai réconforé d'autres réponses de dépassement de pile et c'est la meilleure classe PDO que j'ai trouvée. Je ne suis pas d'accord avec les autres au-dessus de cela, il manque d'explication. Les commentaires du code sont clairs. Je l'ai trouvé très utile.


Sûrement si cela utilise des connexions persistantes, il n'aura pas besoin d'un singleton. Vous pouvez appeler le DB Connecter autant de fois que vous le souhaitez, il devrait tenter de vous connecter ou d'échouer comme un non-persistant mais sans la générale



1
votes

Il semble que vous ayez besoin de fermer le curseur et de la libération (attribuer NULL) au dernier objet de l'instruction PDO aussi pour fermer la connexion.

En outre, ce qui est important à comprendre sur les connexions persistantes, c'est qu'ils persistent, mais vous n'êtes pas garanti que vous n'auriez pas non plus:

  • Être donné votre dernier gestionnaire de connexion dans d'autres exécutions de script
  • Ni réutilisez une connexion antérieure, si elle est toujours "occupée". Occupé peut signifier dans un script, chronométrage etc ... Connections InstanceCiation peut aller sur ... Voir Comprendre entièrement PDO Attr_Persistent

0 commentaires