web-dev-qa-db-fra.com

mysql_connect VS mysql_pconnect

J'ai ce doute, j'ai cherché sur le Web et les réponses semblent être diversifiées. Est-il préférable d'utiliser mysql_pconnect sur mysql_connect lors de la connexion à une base de données via PHP? J'ai lu que pconnect échelait beaucoup mieux, mais d'un autre côté, étant une connexion persistante ... avoir 10 000 connexions en même temps, toutes persistantes, ne me semble pas évolutif.

Merci d'avance.

25
rogeriopvl

Les connexions persistantes devraient être inutiles pour MySQL. Dans d'autres bases de données (telles qu'Oracle), établir une connexion coûte cher et prend du temps. Par conséquent, si vous pouvez réutiliser une connexion, vous gagnerez beaucoup. Mais ces marques de bases de données offrent un regroupement de connexions qui résout le problème mieux.

La connexion à une base de données MySQL est rapide comparée à celle des autres marques. Par conséquent, l’utilisation de connexions persistantes procure proportionnellement moins d’avantages à MySQL qu’elle ne le ferait pour une autre marque de base de données.

Les connexions persistantes ont aussi un inconvénient. Le serveur de base de données alloue des ressources à chaque connexion, que les connexions soient nécessaires ou non. Vous voyez donc beaucoup de ressources inutiles si les connexions sont inactives. Je ne sais pas si vous atteindrez 10 000 connexions inactives, mais même quelques centaines coûtent cher.

Les connexions ont l'état et il serait inapproprié qu'une demande PHP "hérite" des informations d'une session précédemment utilisée par une autre demande PHP. Par exemple, les tables temporaires et les variables utilisateur sont normalement nettoyées lors de la fermeture d'une connexion, mais pas si vous utilisez des connexions persistantes. De même, les paramètres basés sur la session tels que le jeu de caractères et le classement. De plus, LAST_INSERT_ID() rapporterait l'id généré en dernier pendant la session, même si c'était lors d'une précédente requête PHP.

Pour MySQL au moins, les inconvénients des connexions persistantes l'emportent probablement sur leurs avantages. Et il existe d'autres techniques plus performantes pour atteindre une évolutivité élevée.


Mise à jour de mars 2014:

La vitesse de connexion à MySQL était toujours faible comparée aux autres marques de SGBDR, mais elle s’améliore encore.

Voir http://mysqlserverteam.com/improving-connectdisconnect-performance/

Dans MySQL 5.6, nous avons commencé à travailler sur l'optimisation de la gestion du code, des connexions et des déconnexions. Et ce travail s'est accéléré dans MySQL 5.7. Dans ce billet de blog, je vais d'abord montrer les résultats que nous avons obtenus, puis décrire ce que nous avons fait pour les obtenir.

Lisez le blog pour plus de détails et des comparaisons de vitesse.

34
Bill Karwin

Fondamentalement, vous devez équilibrer le coût de la création de connexions par rapport à la conservation des connexions. Même si MySQL est très rapide pour configurer une nouvelle connexion, cela coûte quand même - en temps de configuration du thread et en temps de configuration TCP/IP depuis votre serveur Web. Cela se remarque sur un site à trafic suffisant. Malheureusement, PHP ne dispose d'aucun contrôle sur la persistance des connexions. La solution consiste donc à réduire considérablement le délai d'inactivité dans MySQL (jusqu'à 20 secondes, par exemple) et à augmenter la taille du cache des threads. Ensemble, cela fonctionne généralement remarquablement bien.

D'un autre côté, votre application doit respecter l'état de la connexion. Il est préférable de ne pas présumer de l'état de la session. Si vous utilisez des tables temporaires, utiliser CREATE IF NOT EXISTS et TRUNCATE TABLE aide beaucoup, tout comme le fait de les nommer de manière unique (par exemple, en tant qu'id utilisateur). Les transactions sont un peu plus problématiques; mais votre code peut toujours faire ROLLBACK en haut, juste au cas où.

4
staticsan

Il est très peu probable que vous atteigniez 10000 connexions. Quoi qu'il en soit, allez à la source officielle . (Souligné par moi).

Si N’a aucune fonctionnalité ajoutée dans les connexions persistantes, à quoi sert-il ?

La réponse est extrêmement simple: efficacité . Les connexions persistantes conviennent Si le temps système nécessaire pour créer un lien Avec votre serveur SQL est élevé. Que ce soit ou non , Ces frais généraux sont vraiment élevés Dépend de nombreux facteurs. Par exemple, de quel type Il s’agit, si Ne réside pas sur le même ordinateur que Auquel votre serveur Web est installé, comment A chargé la machine le Le serveur SQL s'assied Dessus, etc. La ligne du bas Est que, si le temps système nécessaire à la connexion est de , des connexions persistantes vous aident à considérablement . Ils font en sorte que le processus enfant Ne se connecte qu'une seule fois Pendant toute sa durée de vie, au lieu de À chaque fois qu'il traite une page pour laquelle Nécessite une connexion au serveur SQL. . Cela signifie que pour chaque enfant qui A ouvert une connexion persistante, Aura sa propre connexion persistante ouverte Au serveur. Par exemple, Si vous aviez 20 processus enfants Différents qui exécutaient un script faisant de Une connexion persistante à votre serveur SQL , Vous auriez 20 processus différents. connexions au serveur SQL, un de chaque enfant.

Notez toutefois que cela peut avoir certains inconvénients Si vous utilisez une base de données Avec des limites de connexion dépassées par Par des connexions enfant persistantes . Si votre base de données a une limite de De 16 connexions simultanées, de Et au cours d'une session de serveur occupé, 17 threads tentent de se connecter à . ne pas être capable de. Si Dans vos scripts contiennent des bogues qui ne permettent pas aux connexions de fermer (Telles que des boucles infinies), la base de données Avec seulement 16 connexions peut soit rapidement submergé. Consultez la documentation de votre base de données Pour obtenir des informations Sur la gestion des connexions abandonnées ou vides .

3
Vinko Vrsalovic

mysql_connect() et mysql_pconnect() fonctionnent tous les deux pour la connexion à la base de données mais avec peu de différences. Dans mysql_pconnect(), p représente la connexion persistante.

Lorsque nous utilisons la fonction mysql_connect(), à chaque ouverture et fermeture de la connexion à la base de données, en fonction de la requête.

Mais en cas de fonction mysql_pconnect():

  • Tout d'abord, lors de la connexion, la fonction essaierait de trouver une connexion (persistante) déjà ouverte avec le même hôte, le même nom d'utilisateur et le même mot de passe. S'il en trouve un, son identifiant sera renvoyé au lieu d'ouvrir une nouvelle connexion.

  • Deuxièmement, la connexion au serveur SQL ne sera pas fermée à la fin de l'exécution du script. Au lieu de cela, la connexion restera ouverte pour une utilisation future (mysql_close() ne ferme pas la connexion établie par mysql_pconnect()).

mysql_pconncet() est utile lorsque vous avez beaucoup de traffice sur votre site. À ce moment-là, pour chaque demande, il n'ouvrira pas de connexion mais le prendra du pool. Cela augmentera l'efficacité de votre site. Mais pour une utilisation générale, mysql_connect () est préférable.

3
Phoenix

MYSQL_CONNECT ()

1.mysql_connect peut être utilisé pour fermer la connexion. Chaque fois qu'il ouvre et ferme la connexion à la base de données, en fonction de la demande.

La base de données 2.Here est ouverte à chaque fois que la page est chargée dans MYSQL Connect

3.Lorsque la page est chargée, la base de données est chargée à chaque fois

4.Il est utilisé pour fermer la connexion

Exemple:

<?php $conn = mysql_connect(‘Host’, ‘mysql_user’, ‘mysql_password’); if(!$conn){ die(‘Could not connect: ‘ . mysql_error()); } echo ‘Connected successfully’; mysql_close($conn); ?>

La description:

Hôte: spécifie un nom d'hôte ou une adresse IP tel que localhost.

mysql_user: Spécifie le nom d'utilisateur MySQL

mysql_password: Spécifie le mot de passe MySQL

MYSQL_PCONNECT ()

1.Nous utilisons mysql_pconncet (), il essaie initialement de trouver une connexion persistante ouverte.

2.Le mysql_pconncet () ouvre une connexion persistante

3.Le mysql_pconnect () ne supporte pas la connexion fermée

4.mysql_pconnect () ne peut pas fermer la connexion. Ici, ouvrez une connexion persistante à la base de données

5.La base de données ici n'a pas besoin d'être connectée à chaque fois.

6.La base de données n’a pas besoin d’être connectée à chaque fois dans mysql_pconncet ().

plus de détails: http://prittytimes.com/difference-between-mysql_connect-and-mysql_pconnect/

0
Pritty M