2010-02-23 5 views
10

Ich habe eine veraltete PHP/MySQL-App, die mysql_connect() aufruft. Tonnen bestehenden Downstream-Codes macht mysql_query() Anrufe entweder direkt oder über Wrapper, die diese Verbindung verwenden.Eine PHP-PDO-Verbindung von einem mysql_connect() erhalten?

Für neuen Code, den ich auf der App entwickeln, würde ich gerne PDO verwenden.

Wenn ich eine PDO-Verbindung mit den gleichen Anmeldeinformationen host/user/pass/dbname mache, könnte ich so viel Glück haben, dass PHP unter der Haube die ursprüngliche Verbindung wiederverwenden wird? Oder wird PHP zwei verschiedene Verbindungen zum Server herstellen (unerwünscht, wenn auch völlig verständlich)?

Danke!

+0

@Pascal, @VolkerK:.! Vielen Dank für die hervorragenden Antworten, auch wenn die Nachricht nicht das, was ich hören wollte ... ;-( Sicher mag ich sie beide akzeptieren konnte Dank wieder –

Antwort

7

Wenn Sie zwei verschiedene APIs verwenden (d. H. mysql_* und PDO), erzeugt PHP zwei verschiedene Verbindungen.


Und als "Beweis", diesen Teil des Codes betrachten:

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


das Lauf werden zwei verschiedene Verbindungen verursachen, auf dem MySQL-Server - die 5 Sekunden lang schlafen:

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) 

(die Verbindungen in Frage sind die beiden letzten, das erschien, als ich das PHP-Skript gestartet, und verschwand nach 5 Sekunden)

8

Beide Erweiterungen verwenden intern EG(persistent_list), um das persistente Verbindungshandle zu speichern. Sie erstellen jedoch unterschiedliche Hashes/Keys für diese Liste, so dass sie keine Einträge der jeweiligen anderen Erweiterung finden können.

Die Erweiterung mysql erstellt Schlüssel der Form "mysql_<host&port>_<user>...", während PDO "PDO:DBH:DSN=<dsn>:<user>:...." erstellt. Die Hashes werden fast wie Array-Schlüssel in einem PHP-Skript verwendet. (Over-) fachter Beispiel:

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

So lautet die Antwort: Nein, die Verbindungen nicht zwischen geteilt werden und wiederverwendet werden durch die MySQL-Erweiterung und PDO.

+0

Ich habe zu fragen, , gibt es eine Möglichkeit, die Verbindungen zu teilen, weil ich es für Transaktionen mit Verwendung paralel die PDO und mysql_connect-Aufrufe benötigen ... Legacy-Code-Problem ... – Sangoku

+0

Soweit ich weiß, ist dies nicht möglich, ohne den Code der PDO zu ändern/mysql-Module. – VolkerK

Verwandte Themen