Получение соединения PHP PDO от mysql_connect ()?

У меня есть приложение PHP/MySQL прежней версии, которое называет mysql_connect (). Тонны существующего нисходящего кода делают mysql_query() вызовы, или непосредственно или через обертки, с помощью этого соединения.

Для нового кода, который я разрабатываю на приложении, я хотел бы начать использовать PDO.

Если я устанавливаю связь PDO с помощью тех же host/user/pass/dbname учетных данных, я мог бы быть так удачлив, что под капотом, PHP снова использует первоначальное соединение? Или PHP создаст два отличных соединения с сервером (нежелательный, хотя полностью понятный)?

Спасибо!

10
задан David Weinraub 27 January 2011 в 12:37
поделиться

2 ответа

Если вы используете два разных 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 секунд)

7
ответ дан 3 December 2019 в 22:36
поделиться

Оба расширения внутренне используют 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.

8
ответ дан 3 December 2019 в 22:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: