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!
A PDO database connection requires you to create a new PDO object with a Data Source Name (DSN), Username, and Password. The DSN defines the type of database, the name of the database, and any other information related to the database if required. These are the variables and values we stated inside the dbconfig.
The return value of mysqli_connectmysqli_connectThe MySQLi Extension (MySQL Improved) is a relational database driver used in the PHP scripting language to provide an interface with MySQL databases. There are three main API options when considering connecting to a MySQL database server: PHP's MySQL Extension.https://en.wikipedia.org › wiki › MySQLiMySQLi - Wikipedia() is a database connection "handle". The handle is an object which represents the connection to the database.
php $servername = "localhost"; $database = "database"; $username = "username"; $password = "password"; // Create connection $conn = mysqli_connectmysqli_connectThe MySQLi Extension (MySQL Improved) is a relational database driver used in the PHP scripting language to provide an interface with MySQL databases. There are three main API options when considering connecting to a MySQL database server: PHP's MySQL Extension.https://en.wikipedia.org › wiki › MySQLiMySQLi - Wikipedia($servername, $username, $password, $database); // Check connection if ($conn->connect_error) { die("Connection failed: " .
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.
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)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With