10

I have a legacy PHP/MySQL app that calls mysql_connect(). Tons of existing downstream code makes mysql_query() calls, either directly or through wrappers, using this connection.

For new code that I develop on the app, I would like to start using PDO.

If I make a PDO connection using the same host/user/pass/dbname credentials, might I be so lucky that under the hood, PHP will re-use the original connection? Or will PHP create two distinct connections to the server (undesirable, albeit totally understandable)?

Thanks!

1
  • @Pascal, @VolkerK: Thanks for the excellent answers, even though the news is not what I wanted to hear... ;-( Sure wish I could accept them both. Thanks again! Commented Feb 24, 2010 at 11:26

2 Answers 2

8

Both extensions internally use EG(persistent_list) to store the persistent connection handle. But they create different hashes/keys for this list, so they can't find entries of the respective other extension.

The mysql extension creates keys of the form "mysql_<host&port>_<user>..." while pdo builds "PDO:DBH:DSN=<dsn>:<user>:....". The hashes are used almost like array-keys in a php script. (Over-)simplyfied example:

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 the answer is: No, the connections will not be shared between and re-used by the mysql extension and PDO.

Sign up to request clarification or add additional context in comments.

2 Comments

I have to ask, is there a way to share the connections? because i need it for transactions with use paralel the PDO and mysql_connect calls... legacy code problem...
As far as I know this is not possible without modifying the code of the pdo/mysql modules.
7

If you are using two different APIs (i.e. mysql_* and PDO), PHP will generate two different connections.


And, as a "proof", consider this portion of code :

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


Running this will cause two distinct connections, on the MySQL server -- which will sleep for 5 seconds :

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) 

(The connections in question are the two last one, which appeared when I started the PHP script, and disappeared after 5 seconds)

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.