在没有可选数据库参数的情况下使用mysql_select_db()或mysql_query()时,PHP如何知道最后一个数据库连接是什么?

ags*_*ala 7 php

请考虑以下代码:

<?php

$conn = mysql_connect('localhost', 'username', 'password');
mysql_select_db('database', $conn);

?>
Run Code Online (Sandbox Code Playgroud)

这可以按预期工作,但PHP如何知道mysql_select_db()在以下示例中调用时要使用的数据库连接?

<?php

mysql_connect('localhost', 'username', 'password');
mysql_select_db('database');

?>
Run Code Online (Sandbox Code Playgroud)

PHP文档声明"如果未指定链接标识符,则假定mysql_connect()打开的最后一个链接." (PHP:mysql_select_db())

存储或检索的最后一个连接在哪里?

Pas*_*TIN 11

我想最后打开的连接的链接保存在内存中,以使事情变得更容易(因为我们通常只使用一个连接).


快速浏览以下内容ext/mysql:(
所有行号都在php_mysql.c- 源代码的版本是几周前PHP 5.3.2-dev的随机快照;因此,它们可能有所改变)

  • 调用的用户空间函数mysql_connect似乎对应于调用的C级函数(第922行)php_mysql_do_connect
  • php_mysql_do_connect函数调用(线832)php_mysql_set_default_link
    • 存储上次打开的连接
  • 还有一个叫做的功能(第908行)php_mysql_get_default_link
  • 当没有传递链接时,该php_mysql_get_default_link函数被调用(第992行)mysql_select_db


php_mysql_set_default_link呼吁这存储default_link:

MySG(default_link) = id; 
Run Code Online (Sandbox Code Playgroud)

MySG是一个宏,定义如下(in 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 
Run Code Online (Sandbox Code Playgroud)

对我来说,几乎看起来像一个全局变量;-)


如果你愿意,你可以自己看一下这些来源:ext/mysql/php_mysql.cext/mysql/php_mysql_structs.h.

正如我所说,自从我检查的版本以来,这可能已经被修改了一些 - 这意味着行号可能不完全匹配; 但功能名称很容易理解,所以你应该能够找到什么叫什么和在哪里:-)