php单例模式在数据库连接中的使用

时间:2022-12-11 08:57:07

      今天同事问到一个关于单例模式在php中是否有用的问题,我们知道,单例的目的是为了避免重复生产相同的对象,一般情况在数据库连接中,为了避免多次拿到相同数据库连接,使用到单例模式,我们来看一下单例模式数据库连接中的使用。

 

  我们先看一段代码,我们想对数据库做两次连接

<?php
$con
= mysql_connect("127.0.0.1", "xxxxxxx", "xxxxxxx"); $con1 = mysql_connect("127.0.0.1", "xxxxxxx", "xxxxxxx"); var_dump($con1); var_dump($con);
sleep(1000); //避免脚本执行完连接中断

 

php单例模式在数据库连接中的使用

 

php单例模式在数据库连接中的使用

 

      从结果,我们可以看到$con和$con1的值是一样的,实际上mysql_connect()函数返回的是php脚本申请到的socket标识符,一旦发现申请过,同时发现不需要从新连接,它就返回申请过的标识符,但是一旦因为超时等原因关闭了连接,该socket标识符失效了怎么办。mysql_connect()提供第四个参数来表示是否需要从新连接我们看一下

 

<?php
$con
= mysql_connect("127.0.0.1", "xxxxxxx", "xxxxxxx", true); var_dump($con); $con1 = mysql_connect("127.0.0.1", "xxxxxxx", "xxxxxxx", true); var_dump($con1);
sleep(1000)

 

php单例模式在数据库连接中的使用

 

php单例模式在数据库连接中的使用

 

现在,我们发现建立了两次连接,我们可以用同样的方式,建立三次,四次,甚至更多的连接,可是这样的方式,必定带来连接资源的极大损耗,我们只需要一个有用的连接,其余的都释放掉,如此,我们封装一下测试代码,如下:

<?php
class
instance { static $link; public static function getLink($newLink = false) { if(isset(self::$link) && self::$link && !$newLink) { return self::$link; } else { self::$link = mysql_connect("127.0.0.1", "xxxxxxx", "xxxxxxx", $newLink); return self::$link; } } } var_dump(instance::getLink()); //获取新连接 var_dump(instance::getLink()); var_dump(instance::getLink(true)); //获取新连接 var_dump(instance::getLink(true)); //获取新连接 var_dump(instance::getLink());

 

我们再看一下结果,有三处获取新连接,在获取新连接后,由于更新self::$link 的结果,旧的连接就会被释放掉。

 

php单例模式在数据库连接中的使用

php单例模式在数据库连接中的使用
 

 

总结:

1、数据库连接的单例模式可以提供唯一可使用对象,释放无用连接资源

2、封装代码,使得代码简洁,清晰