Рассмотрите следующий код:
Это работает как ожидалось, но как делает PHP, знают что соединение с базой данных использовать при вызове mysql_select_db()
в следующем примере?
Документация PHP указывает, что, "Если идентификатор канала не указан, последняя ссылка, открытая mysql_connect (), принята". (PHP: mysql_select_db ())
Откуда последнее соединение сохранено или получено?
Я полагаю, что ссылка на последнее открытое соединение хранится где-то в памяти, чтобы упростить задачу (поскольку мы обычно часто используем только одно соединение) .
Быстрый просмотр исходников ext / mysql
:
(Все номера строк находятся в php_mysql.c
- версия исходных текстов случайный снимок PHP 5.3.2-dev, сделанный пару недель назад; так что они могли немного измениться)
mysql_connect
, похоже, соответствует уровню C. функция называется php_mysql_do_connect
(строка 922) php_mysql_do_connect
php_mysql_set_default_link
(строка 832)
php_mysql_get_default_link
(строка 908) php_mysql_get_default_link
вызывается mysql_select_db
, когда на нее не передана ссылка (строка 992)
И php_mysql_set_default_link
вызывает это, чтобы сохранить default_link
:
MySG(default_link) = id;
Это MySG
, являющееся макросом, определенным следующим образом (в php_mysql_structs.h
) :
#ifdef ZTS
# define MySG(v) TSRMG(mysql_globals_id, zend_mysql_globals *, v)
#else
# define MySG(v) (mysql_globals.v)
#endif
Мне кажется, что это глобальная переменная; -)
Если хотите, можете сами взглянуть на исходники: ext / mysql / php_mysql.c
и ext / mysql / php_mysql_structs.h
.
Как я уже сказал, это, вероятно, было немного изменено по сравнению с версией, в которой я проверял - это означает, что номера строк могут не совпадать точно; но имена функций достаточно легко понять, так что вы сможете отследить, что вызывает что и где: -)
Хотелось бы, чтобы этот класс вам помог, я уже написал его ............ извините, он требует тестирования
class connectionManager(){
protected $array = array(
"connection1" => "host3-username-password-database1" ,
"connection2" => "host2-username-password-database2" ,
"connection3" => "host1-username-password-database3" ,
)
protected $history = array();
public function __construct($connectionID = connection1){
$this->savelastConnecton($connectionID);
/*do you magic here to change the string above to desired format
sorry but i gatta go
btw i liked your question
*/
mysql_connect($host , $username , $password);
mysql_select_db($database);
return true ;
}
publich function getLastConnection( ){
return end($this->history[$lastnumber]) ;
}
private function saveLastConnection($connectionID){}
$this->history[] = $connectionID ;
return true ;
}