php - mysql_close关闭哪个连接标识

查看:218
本文介绍了php - mysql_close关闭哪个连接标识的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

这是一道古老的题目

请看代码,数据库关闭指令将关闭哪个连接标识?( )

$link1 =mysql_connect("localhost","root","");
$link2 = mysql_connect("localhost","root","");
mysql_close();

A.$link1
B.$link2
C.全部关闭
D.报错

根据知识储备,mysql_close在未指定连接标识时,是就近原则。
手册上也有说明

mysql_close() closes the non-persistent connection to the MySQL server that's associated with the specified link identifier. If link_identifier isn't specified, the last opened link is used.

所以答案应该是B。

再想想,似乎有哪里漏了,

If a second call is made to mysql_connect() with the same arguments, no new link will be established, but instead, the link identifier of the already opened link will be returned.

那么两次connect打开的应该是同一个连接标识,那么应该是一起关闭了吧?
所以选C???

没错,我就是闲的蛋疼,要挣扎着纠结这一个将要被淘汰的函数。于是又验证了一下。

$link1 = mysql_connect('localhost','root','');
$link2 = mysql_connect('localhost','root','');
print_r($link1);
print_r($link2);//$link1和$link2一样,第二次未创建新连接,返回已经打开的连接标识
mysql_close();
//下面可以正常打test库里表都打印出来
mysql_select_db('test',$link2);
$rs = mysql_query('show tables;',$link2);
while ($row = mysql_fetch_assoc($rs)) {
    print_r($row);
    echo "<br />";
}
//这个当然也能
mysql_select_db('test',$link1);
$rs = mysql_query('show tables;',$link1);
while ($row = mysql_fetch_assoc($rs)) {
    print_r($row);
    echo "<br />";
}

没错,mysql_close()谁也没关闭。

实际上,如果把mysql_close();修改为

mysql_close($link1);
或者
mysql_close($link2);

下面$link1,$link2仍然都是有效的

如果真要close,只有这样才好使,

mysql_close($link1);
mysql_close($link2);

两个一起close。

这是为什么呢?为什么呢?

解决方案

楼主的测试很赞,确实如此,mysql_connect返回的肯定是一个引用,如楼主的测试说明该句柄不但有一个变量引用而且还有一个句柄引用(我自己随便命名的),mysql_close的时候释放句柄引用,然后检查该变量的所有句柄引用是不是都被释放了,如果是的话则对该变量进行内存回收处理。例如

$a = 'Hello';
$b = &$a;
$c = &$a;
unset($a);
echo $b . $c; //HelloHello 而不是 null

这个测试代码说明了内存回收关于引用的处理,所以推测mysql_close也是类似的处理,但是与unset的管理目标是不同的(例如unset管理的是内存指针,mysql_close管理的是连接句柄指针?)

不过貌似研究这个已经完全没有价值了,相同的事情在mysqli系列函数上不会发生:

<?php
$link1 = mysqli_connect('localhost', 'root');
$link2 = mysqli_connect('localhost', 'root');
mysqli_close($link1);
print_r(mysqli_get_host_info($link1));
print_r(mysqli_get_host_info($link2));

而且php5已经抛弃了mysql系列函数,因此就算是bug或者不良问题也不会被修复了,调用mysql_connect时应该能看到警告信息:该系列函数将会在未来停止使用。

这篇关于php - mysql_close关闭哪个连接标识的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆