У меня есть приложение PHP/MySQL прежней версии, которое называет mysql_connect (). Тонны существующего нисходящего кода делают mysql_query()
вызовы, или непосредственно или через обертки, с помощью этого соединения.
Для нового кода, который я разрабатываю на приложении, я хотел бы начать использовать PDO.
Если я устанавливаю связь PDO с помощью тех же host/user/pass/dbname учетных данных, я мог бы быть так удачлив, что под капотом, PHP снова использует первоначальное соединение? Или PHP создаст два отличных соединения с сервером (нежелательный, хотя полностью понятный)?
Спасибо!
Если вы используете два разных API (например, mysql _ *
и PDO), PHP сгенерирует два разных соединения.
И в качестве «доказательства» рассмотрим эту часть кода:
$db = mysql_connect('localhost', 'USER', 'PASSWORD');
$pdo = new PDO('mysql://@localhost/astralblog', 'USER', 'PASSWORD');
sleep(5);
Выполнение этого вызовет два разных соединения на сервере MySQL, которые будут находиться в спящем режиме на 5 секунд:
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)
(Рассматриваемые соединения: два последних, которые появились, когда я запустил скрипт PHP, и исчезли через 5 секунд)
Оба расширения внутренне используют EG (persistent_list) для хранения постоянного дескриптора соединения. Но они создают разные хэши / ключи для этого списка, поэтому они не могут найти записи соответствующего другого расширения.
Расширение mysql создает ключи вида "mysql_
, в то время как pdo строит "PDO: DBH: DSN =
. Хеши используются почти как ключи массива в скрипте php. (Чрезмерно) упрощенный пример:
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
}
}
Итак, ответ: нет, соединения не будут совместно использоваться и повторно использоваться расширением mysql и PDO.