Получить фактическое открытое соединение БД - PullRequest
1 голос
/ 16 февраля 2012

Как я могу проверить, открыто ли db-соединение в PHP?

Как я могу получить ссылку на это соединение?

Как я могу определить, является ли это MySQL, Postgres или что-то еще?

Ответы [ 4 ]

2 голосов
/ 16 февраля 2012

В идеале вы должны знать переменную, в которой сохраняется соединение.Без этого становится трудно найти его.Это означает, что вам придется проходить через каждую переменную и проверять каждую, но делать это по любой причине может быть проблематично, поскольку она не найдет переменные вне текущей области.Вы можете зациклить текущие переменные, используя:

foreach(get_defined_vars() as $x){
    // Code
}

Чтобы проверить, является ли переменная допустимым соединением, вы можете использовать приведенный ниже код, он должен вернуть целое число:Зная его соединение, вы можете использовать следующее, чтобы вернуть тип соединения, например, mysql.

echo get_resource_type($connection);
2 голосов
/ 16 февраля 2012

Вероятно, лучшее решение проблемы - не потерять связь с БД.

Рассмотрите возможность интеграции ORM в ваш проект, такой как Doctrine или Propel , или, если вы хотите что-то более легкое, рассмотрите DBAL, такой как Zend_Db, Все эти решения инкапсулируют соединения с базой данных в экземплярах классов, гарантируя, что они всегда доступны для вашего кода, если это необходимо.

2 голосов
/ 16 февраля 2012

Вам придется перебирать каждую определенную переменную и выяснять, является ли она дескриптором ресурса или нет. Попробуйте get_defined_vars () .

1 голос
/ 16 февраля 2012

В общих чертах, я не думаю, что это действительно возможно, по крайней мере, с помощью какого-то сложного обходного пути. Например, вы можете перебрать все определенные переменные:

foreach(get_defined_vars() as $variable){
    if( is_resource($variable) && get_resource_type($variable)=='mysql link' ){
            // Found a connection!
        var_dump($variable);
    }
}

Хотя на самом деле соединение остается доступным, даже если он назначен локальной переменной вне текущей области:

function foo(){
    $conn = mysql_connect('localhost', 'test', 'test');
}
foo();
$res = mysql_query('SELECT NOW() AS what_is_the_time');
if( $row = mysql_fetch_assoc($res) ){
    var_dump($row);
}

Проблема в том, что PHP на самом деле не заботится о переменных, когда речь идет о соединениях:

// One connection and zero variables!
mysql_connect('localhost', 'test', 'test');
$res = mysql_query('SELECT NOW() AS what_is_the_time');
if( $row = mysql_fetch_assoc($res) ){
    var_dump($row);
}

Вы можете попробовать найти информацию о текущем соединении:

var_dump(mysql_thread_id());
// int(2696)

... хотя многие функции просто попытаются установить новое соединение, если его нет, поэтому должны позаботиться о предупреждениях ...:

Предупреждение: mysql_thread_id (): доступ запрещен для пользователя '' @ 'localhost' (используется пароль: НЕТ)
BOOL (ложь)

... если только ваша конфигурация фактически не допускает успешной попытки подключения без полномочий.

Я почти уверен, что все, что вы хотите сделать, можно сделать совершенно по-другому:)

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