У меня есть устаревшее приложение 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_<host&port>_<user>..."
а pdo создает "PDO:DBH:DSN=<dsn>:<user>:...."
. Хэши используются почти как массивные ключи в php-скрипте. (Over-) простой пример:
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.