pconnect, prepared statements, quel niveau de factorisation?

Eléphant du PHP | 63 Messages

16 févr. 2010, 20:12

Bonjour,

J'essaye de comprendre les bénéfices possibles de l'utilisation de ces deux fonctionnalités, connexion persistante et preprared statements, supposés "factoriser" les échanges avec un serveur de base de données (mysql en ce qui me concerne).

Exemple :
- un client A appelle mon script http://www.domaine.com/login.php sur serveur1.domaine.local, se connecte à mysql1.domaine.local, et exécute SELECT * FROM users WHERE user = 'A'
- un client B appelle mon script http://www.domaine.com/login.php sur serveur1.domaine.local, se connecte à mysql1.domaine.local, et exécute SELECT * FROM users WHERE user = 'B'
- un client C appelle mon script http://www.domaine.com/login.php sur serveur2.domaine.local, se connecte à mysql1.domaine.local, et exécute SELECT * FROM users WHERE user = 'C'
- un client D appelle mon script http://www.domaine.com/login.php sur serveur2.domaine.local, se connecte à mysql2.domaine.local, et exécute SELECT * FROM users WHERE user = 'D'
J'ai donc 2 serveurs http (apache) et 2 serveurs sql (mysql), et j'exécute 4 requêtes
- Avec pconnect, est-ce que j'ouvre :
--> 2 connexions ? (une par serveur mysql)
--> 3 connexions ? (une par couple serveur mysql, serveur apache)
--> 4 connexions ? (une par appel de script)
- De même, avec des prepared statements, est-ce que ma requête est compilée 2, 3, 4 fois ?

Je ne trouve pas de documentation claire à ce sujet, mais je serai ravi si vous en avez sous la main

D'avance merci !

ViPHP
ViPHP | 2287 Messages

17 févr. 2010, 01:21

Bonjour,

C'est normal que tu ne trouves pas de réponse claire car la réalité est plus compliquée que ça et d'autres paramètres entrent en jeu (notamment, le type et la configuration ton serveur web, sa charge, et aussi la façon dont tu as installé php...).

Les connexions persistantes ont pour caractéristique d'être maintenues dans un état "dormant" quand elles ne sont plus utilisées (au lieu d'être simplement fermées). Au niveau réseau (TCP), une connexion active est établie entre deux hôtes désignés par leur adresse ip. Pour que ce mécanisme soit utile, il faut que le programme (process) qui a initié les connexions, et sa mémoire associée, continue à "exister" sur le système pour pouvoir référencer et maintenir l'état de ces connexions dormantes. Tu peux donc obtenir ce comportement sur un PHP compilé en tant que module apache, mais pas en CGI.

Dans un scénario idéal, ton exemple donnerait donc lieu à la création de trois connexions : 1 de web1 à sql1 (réutilisée pour le client B), 1 de web2 à sql1 et 1 de web2 à sql2.

Quelques liens (en anglais) pour aller plus loin et examiner les connexions persistantes d'un oeil critique :
http://www.robertswarthout.com/2008/08/ ... nnections/
http://www.mysqlperformanceblog.com/200 ... ions-evil/
if(!@work()){ Nespresso(); } else { what(); }
______________________________