Как PHP знает то, что - последнее соединение с базой данных, когда mysql_select_db () или mysql_query () используется без дополнительного параметра базы данных?

Рассмотрите следующий код:


Это работает как ожидалось, но как делает PHP, знают что соединение с базой данных использовать при вызове mysql_select_db() в следующем примере?


Документация PHP указывает, что, "Если идентификатор канала не указан, последняя ссылка, открытая mysql_connect (), принята". (PHP: mysql_select_db ())

Откуда последнее соединение сохранено или получено?

7
задан agscala 29 March 2010 в 19:26
поделиться

2 ответа

Я полагаю, что ссылка на последнее открытое соединение хранится где-то в памяти, чтобы упростить задачу (поскольку мы обычно часто используем только одно соединение) .


Быстрый просмотр исходников 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 .

Как я уже сказал, это, вероятно, было немного изменено по сравнению с версией, в которой я проверял - это означает, что номера строк могут не совпадать точно; но имена функций достаточно легко понять, так что вы сможете отследить, что вызывает что и где: -)

11
ответ дан 6 December 2019 в 23:04
поделиться

Хотелось бы, чтобы этот класс вам помог, я уже написал его ............ извините, он требует тестирования

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 ;    

}
0
ответ дан 6 December 2019 в 23:04
поделиться
Другие вопросы по тегам:

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