2010-02-23 7 views
10

J'ai un PHP/MySQL app héritage qui appelle mysql_connect(). Des tonnes de code aval existant effectuent des appels mysql_query(), directement ou via des wrappers, en utilisant cette connexion.Obtenir une connexion PHP PDO à partir d'un mysql_connect()?

Pour le nouveau code que je développe sur l'application, je voudrais commencer à utiliser PDO.

Si je crée une connexion PDO en utilisant les mêmes informations d'identification hôte/utilisateur/passe/nom_bdd, serais-je si chanceux que sous le capot, PHP réutilisera la connexion d'origine? Ou PHP créera-t-il deux connexions distinctes au serveur (indésirable, bien que totalement compréhensible)?

Merci!

+0

@Pascal, @VolkerK:.! Merci pour les excellentes réponses, même si les nouvelles ne sont pas ce que je voulais entendre ... ;-( voudrais bien que je puisse les accepter à la fois Merci encore –

Répondre

7

Si vous utilisez deux API (à savoir mysql_* et AOP), PHP va générer deux connexions différentes.


Et, comme "preuve", cette partie de considérer le code:

$db = mysql_connect('localhost', 'USER', 'PASSWORD'); 
$pdo = new PDO('mysql://@localhost/astralblog', 'USER', 'PASSWORD'); 
sleep(5); 


L'exécution de cette provoque deux connexions distinctes, sur le serveur MySQL - qui dormira pendant 5 secondes:

mysql> show processlist; 
+----+------------+-----------------+------------+---------+------+-------+------------------+ 
| Id | User  | Host   | db   | Command | Time | State | Info    | 
+----+------------+-----------------+------------+---------+------+-------+------------------+ 
| 41 | astralblog | localhost:46551 | astralblog | Sleep | 188 |  | NULL    | 
| 42 | astralblog | localhost:46552 | astralblog | Sleep | 188 |  | NULL    | 
| 43 | astralblog | localhost  | astralblog | Query | 0 | NULL | show processlist | 
| 64 | astralblog | localhost  | NULL  | Sleep | 4 |  | NULL    | 
| 65 | astralblog | localhost  | NULL  | Sleep | 4 |  | NULL    | 
+----+------------+-----------------+------------+---------+------+-------+------------------+ 
5 rows in set (0,00 sec) 

(les connexions en question sont les deux dernière, qui est apparu quand j'ai commencé le script PHP, et disparaissaient au bout de 5 secondes)

8

Les deux extensions utilisent en interne EG(persistent_list) pour stocker la poignée de connexion persistante. Mais ils créent différents hachages/clés pour cette liste, donc ils ne peuvent pas trouver les entrées de l'autre extension respective. L'extension mysql crée des clés de la forme "mysql_<host&port>_<user>..." tandis que pdo crée "PDO:DBH:DSN=<dsn>:<user>:....". Les hachages sont utilisés presque comme des tableaux dans un script php. (Sur-) exemple simplyfied:

function pconnect($host,$user,$pass) { 
    global $persistent_list; 
    $hashkey = sprintf("extensionname_%s_%s_%s", $host, $user, $pass); 
    if (isset($persistent_list[$hashkey])) { 
    // use stored connection 
    } 
    else { 
    // create new connection 
    } 
} 

La réponse est: Non, les connexions ne seront pas partagées entre et réutilisée par l'extension MySQL et PDO.

+0

je dois demander , est-il un moyen de partager les connexions? parce que je besoin pour les transactions avec l'utilisation paralel les appels AOP et mysql_connect ... problème de code hérité ... – Sangoku

+0

pour autant que je sais que ce n'est pas possible sans modifier le code de l'ODP/modules mysql. – VolkerK