2008-10-29 21 views
22

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 évolue beaucoup mieux, mais d'un autre côté, être une connexion persistante ... avoir 10 000 connexions en même temps, toutes persistantes, ne me semble pas évolutif.mysql_connect VS mysql_pconnect

Merci d'avance.

Répondre

33

Les connexions persistantes devraient être inutiles pour MySQL. Dans d'autres bases de données (telles qu'Oracle), établir une connexion est coûteux et prend du temps, donc si vous pouvez réutiliser une connexion c'est une grande victoire. Mais ces marques de base de données offrent la mise en commun des connexions, ce qui résout mieux le problème.La connexion à une base de données MySQL est rapide comparée à celle d'autres marques, donc l'utilisation de connexions persistantes donne proportionnellement moins d'avantages pour MySQL que pour une autre marque de base de données.

Les connexions persistantes ont également 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 gaspillées si les connexions sont inactives. Je ne sais pas si vous atteindrez 10 000 connexions inactives, mais même quelques centaines d'entre elles sont coûteuses.

Les connexions ont un état, et il serait inapproprié qu'une requête PHP "hérite" des informations d'une session précédemment utilisée par une autre requête PHP. Par exemple, les tables temporaires et les variables utilisateur sont normalement nettoyées lorsqu'une connexion se ferme, mais pas si vous utilisez des connexions permanentes. 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() indiquerait l'identifiant généré en dernier pendant la session - même si c'était lors d'une requête PHP précédente. Pour MySQL au moins, les inconvénients des connexions persistantes l'emportent probablement sur leurs avantages. Et il existe d'autres, meilleures techniques pour atteindre une grande évolutivité.


Mise à jour Mars 2014:

vitesse de connexion MySQL est toujours faible par rapport à d'autres marques de SGBDR, mais il devient encore mieux.

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

En MySQL 5.6, nous avons commencé à travailler sur l'optimisation du code de gestion IT et des déconnexions. Et ce travail s'est accéléré dans MySQL 5.7. Dans ce billet, 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 de comparaisons de vitesse.

3

Il est très peu probable que vous atteigniez 10000 connexions. De toute façon, allez au official source. (Emphasis mine).

Si les connexions persistantes n'ont pas aucune fonctionnalité ajoutée, ce sont elles? La réponse ici est extrêmement simple: Les connexions persistantes sont bon si la surcharge pour créer un lien vers votre serveur SQL est élevée. Que ce soit pas ce frais généraux est vraiment élevé dépend de nombreux facteurs. Comme, ce sorte de base de données c'est, ou pas il se trouve sur le même ordinateur sur que votre serveur web se trouve, comment chargé la machine le serveur SQL se trouve sur est et ainsi de suite. La ligne de fond est que si cette surcharge de connexion est haute, les connexions persistantes vous aident considérablement. Ils provoquent la connexion du processus enfant simplement une fois pour toute sa durée de vie, au lieu de chaque fois qu'il traite une page que requiert la connexion au serveur SQL. Cela signifie que pour chaque enfant ayant ouvert une connexion persistante, aura sa propre connexion ouverte persistante au serveur. Par exemple, si vous aviez 20 différents processus enfants qui ont fonctionné un script qui a fait une connexion persistante à votre serveur SQL , vous auriez 20 différents connexions au serveur SQL, un de chaque enfant.

Notez, cependant, que cela peut avoir quelques inconvénients si vous utilisez une base de données avec des limites de connexion qui sont par enfant persistante dépassées connexions. Si votre base de données a une limite de 16 connexions simultanées, et au cours d'une session de serveur occupé , 17 threads enfants tentent de se connecter à , on ne pourra pas. Si il y a des bogues dans vos scripts qui ne permettent pas aux connexions de se fermer vers le bas (comme les boucles infinies), la base de données avec seulement 16 connexions peut rapidement être submergée par . Vérifiez la documentation de votre base de données pour obtenir des informations sur la gestion des connexions abandonnées ou inactives.

4

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 lors de la configuration d'une nouvelle connexion, cela coûte quand même - dans le temps d'installation du thread, et dans le temps de configuration TCP/IP de votre serveur web. Ceci est perceptible sur un site de trafic assez élevé. Malheureusement, PHP n'a aucun contrôle sur la persistance des connexions. La réponse est donc de réduire le délai d'inactivité de MySQL (jusqu'à 20 secondes) et de réduire la taille du cache de threads. Ensemble, cela fonctionne généralement bien. D'un autre côté, votre application doit respecter l'état de la connexion. Il est préférable de ne pas faire de suppositions sur l'état de la session. Si vous utilisez des tables temporaires, l'utilisation de CREATE IF NOT EXISTS et TRUNCATE TABLE aide beaucoup, tout comme les nommer de manière unique (comme l'ID utilisateur). Les transactions sont un peu plus problématiques; mais votre code peut toujours faire ROLLBACK en haut, juste au cas où.

+0

Dans les versions plus récentes de PHP que quand j'ai écrit cette réponse, j'ai découvert qu'il ya maintenant des paramètres de réglage de la taille de la piscine. En particulier, 5.4.0 a l'option 'mysqli.max_persistent' qui est la taille maximale du pool de connexion dans cette instance de PHP. Il n'y a toujours pas de valeur dans PHP pour temporiser les connexions. – staticsan

3

mysql_connect() et mysql_pconnect() les deux fonctionnent pour la connexion à la base de données, mais avec peu de différence. Dans mysql_pconnect(), p est synonyme de connexion de persistance.

Lorsque nous utilisons mysql_connect() fonction, chaque fois qu'il ouvre et ferme la connexion à la base de données, en fonction de la demande.

Mais en cas de mysql_pconnect() fonction:

  • Tout d'abord, lors de la connexion, la fonction essaierait de trouver une connexion (persistante) qui est déjà ouvert avec le même hôte, nom d'utilisateur et mot de passe. Si l'un d'eux est trouvé, un identifiant sera retourné au lieu d'ouvrir une nouvelle connexion. Deuxièmement, la connexion au serveur SQL ne sera pas fermée lorsque l'exécution du script se terminera. Au lieu de cela, la connexion restera ouverte pour une utilisation future (mysql_close() ne fermera 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 requête, il n'ouvrira pas de connexion mais le sortira de la piscine. Cela augmentera l'efficacité de votre site. Mais pour un usage général, mysql_connect() est le meilleur.

+0

mysql_pconnect() est-ce préférable de l'utiliser avec mysqlnd? ", la fonction essaie de trouver une connexion (persistante) qui est déjà ouverte avec le même hôte, nom d'utilisateur et mot de passe." - Je pense que cela fonctionne mieux avec mysqlnd ou je me trompe? – consigliere

0

mysql_connect()

1.mysql_connect peut être utilisé pour fermer le temps de connection.Every son ouverture et fermeture de la connexion de base de données, en fonction de la demande.

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

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

4.It 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); ?> 

description:

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

mysql_user: Indique le nom d'utilisateur MySQL

mysql_password: Indique le mot de passe MySQL

mysql_pconnect()

1.We utiliser le mysql_pconncet(), il tente d'abord de trouver une ouverture persistante connexion.

2.Le mysql_pconncet() ouvre une connexion persistante

3.Le mysql_pconnect() ne prend pas en charge la connexion à proximité

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 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/