Получение соединения PHP PDO от mysql_connect ()? - PullRequest
10 голосов
/ 23 февраля 2010

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

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

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

Спасибо!

Ответы [ 2 ]

8 голосов
/ 23 февраля 2010

Оба внутренних номера используют EG (persistent_list) для хранения дескриптора постоянного соединения. Но они создают разные хэши / ключи для этого списка, поэтому они не могут найти записи соответствующего другого расширения.

Расширение mysql создает ключи вида "mysql_<host&port>_<user>...", в то время как pdo создает "PDO:DBH:DSN=<dsn>:<user>:....". Хеши используются почти как ключи массива в скрипте 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.

7 голосов
/ 23 февраля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...