2010-02-23 18 views
10

Tengo una aplicación heredada de PHP/MySQL que llama a mysql_connect(). Toneladas de código descendente existente hace llamadas mysql_query(), ya sea directamente o a través de envolturas, utilizando esta conexión.Obteniendo una conexión PHP PDO desde mysql_connect()?

Para el código nuevo que desarrollo en la aplicación, me gustaría comenzar a usar PDO.

Si realizo una conexión PDO usando las mismas credenciales de host/usuario/pass/dbname, ¿podría ser tan afortunado que, bajo el capó, PHP volverá a utilizar la conexión original? ¿O creará PHP dos conexiones distintas con el servidor (indeseable, aunque totalmente comprensible)?

Gracias!

+0

@Pascal, @VolkerK:.! Gracias por las respuestas excelentes, a pesar de que la noticia no es lo que quería escuchar ... ;-( Claro Me gustaría poder aceptar a los dos Gracias de nuevo –

Respuesta

7

Si está utilizando dos API diferentes (es decir, mysql_* y PDO), PHP generará dos conexiones diferentes.


Y, como una "prueba", tenga en cuenta esta porción de código:

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


La ejecución de este hará que dos conexiones distintas, en el servidor MySQL - que dormir durante 5 segundos:

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) 

(las conexiones en cuestión son los dos último, que apareció cuando empecé el script PHP, y desapareció después de 5 segundos)

8

Ambas extensiones utilizan internamente EG(persistent_list) para almacenar el identificador de conexión persistente. Pero crean diferentes hash/claves para esta lista, por lo que no pueden encontrar entradas de la otra extensión respectiva.

La extensión mysql crea claves del formulario "mysql_<host&port>_<user>..." mientras que las construcciones pdo "PDO:DBH:DSN=<dsn>:<user>:....". Los hashes se usan casi como matrices en un script php. (Sobre) simplyfied ejemplo:

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

Así que la respuesta es: No, las conexiones no se compartirá entre y re-utilizada por la extensión de MySQL y PDO.

+0

tengo que preguntar , ¿hay alguna manera de compartir las conexiones? porque lo necesito para transacciones con el uso paralelo de las llamadas PDO y mysql_connect ... problema del código heredado ... – Sangoku

+0

Por lo que yo sé, esto no es posible sin modificar el código del pdo/módulos mysql. – VolkerK