PHP中PDO关闭连接的方法问题

 更新时间:2021年01月06日 08:34:03   作者:硬核项目经理  
这篇文章主要介绍了PHP中PDO关闭连接的方法问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在之前我们手写 mysql 的连接操作时,一般都会使用 mysql_close() 来进行关闭数据库连接的操作。不过在现代化的开发中,一般使用框架都会让我们忽视了底层的这些封装,而且大部分框架都已经默认是使用 PDO 来进行数据库的操作,那么,大家知道 PDO 是如何关闭数据的连接的吗?

官方说明

要想关闭连接,需要销毁对象以确保所有剩余到它的引用都被删除,可以赋一个 NULL 值给对象变量。如果不明确地这么做,PHP 在脚本结束时会自动关闭连接。

$pdo = new PDO('mysql:host=127.0.0.1;port=3306;dbname=blog_test', 'root', '');
$pdo = null;

官方文档中说得很明白,那就是给 PDO 对象赋值为 NULL 即可。但是事情真的有那么简单吗?

实际测试

我们来这样进行一下测试,正常情况下,我们打开数据库连接后都不会直接就关闭,而是要进行一些操作。

$pdo = new PDO('mysql:host=127.0.0.1;port=3306;dbname=blog_test', 'root', '');
 
$stmt = $pdo->prepare('SELECT * FROM zyblog_test_user');
$stmt->execute();
 
$pdo = null;
sleep(60);

运行上述代码后,我们在数据库使用 show full processlist; 查看连接进程,会发现当前的连接并没有马上关闭,而是等到 60 秒之后,也就是页面执行完成之后才会关闭。似乎 $pdo = null; 这句并没有执行成功。

其实,在官方文档中已经说明了这个情况,只是大家可能不太会注意。【需要销毁对象以确保所有剩余到它的引用都被删除】,在上面的代码中,\$stmt 预编译 SQL 语句的功能调用的是 $pdo 对象中的方法,它们之间产生了引用依赖的关系,这样的情况下,直接给 $pdo = null; 是没有效果的,我们需要将 $stmt 也赋值为 null 。

$pdo = new PDO('mysql:host=127.0.0.1;port=3306;dbname=blog_test', 'root', '');
 
$stmt = $pdo->prepare('SELECT * FROM zyblog_test_user');
$stmt->execute();
 
$stmt = null;
$pdo = null;
sleep(60);

mysqli测试

那么使用 mysqli 的默认扩展组件,也就是使用 mysqli 对象中的 close() 来关闭数据库连接会有这个问题吗?还是直接用代码来测试测试。( mysql 扩展已经过时不推荐使用了,大家如果要自己封装数据库操作类或者写小 Demo 的话还是要用 mysqli 更好一些 )

$conn = new mysqli('127.0.0.1', 'root', '', 'blog_test');
 
$result = $conn->query('SELECT * FROM zyblog_test_user');
$stmt = $conn->prepare("SELECT * FROM zyblog_test_user");
$stmt->execute();
 
$conn->close();
 
sleep(60);

在运行上述代码后,我们在数据库中查看连接进程就不会看到还在执行的连接的,也就是说在 mysqli 中调用 close() 方法是能够直接马上关闭掉数据库的连接的。

总结

其实今天的内容也是官方文档关于数据库连接这一页文档上的一个 Note 中的信息。很早就有大神发现了这个问题并且分享了出来,但是大部分人根本都不知道这个问题,甚至很多人连 PDO 也是可以关闭数据库连接的都不知道。框架在带给我们便利的同时,确实也将很多东西封装的太好了,以至于很多朋友都不去关心底层的一些内容,但是,当你向更高阶层迈进时,往往这些底层的东西会成为你的阻碍。

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202008/source/PHP%E4%B8%ADPDO%E5%85%B3%E9%97%AD%E8%BF%9E%E6%8E%A5%E7%9A%84%E9%97%AE%E9%A2%98.php

参考文档:

https://www.php.net/manual/zh/pdo.connections.php

https://www.php.net/manual/zh/pdo.connections.php#114822

到此这篇关于PHP中PDO关闭连接的方法问题的文章就介绍到这了,更多相关PHP PDO关闭连接 内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • PHP+Mysql+jQuery实现发布微博程序 jQuery篇

    PHP+Mysql+jQuery实现发布微博程序 jQuery篇

    我们在QQ个人中心或者新浪微博等网站上可以看到一个发表话题的应用
    2011-10-10
  • PHP随机生成中文段落示例【测试网站内容时使用】

    PHP随机生成中文段落示例【测试网站内容时使用】

    这篇文章主要介绍了PHP随机生成中文段落,结合实例形式分析了PHP针对随机中文段落的编码转换、生成相关操作技巧,需要的朋友可以参考下
    2020-04-04
  • php通过分类列表产生分类树数组的方法

    php通过分类列表产生分类树数组的方法

    这篇文章主要介绍了php通过分类列表产生分类树数组的方法,涉及php操作数组与分类节点的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-04-04
  • PHP中redis的用法深入解析

    PHP中redis的用法深入解析

    本篇文章主要是对PHP中redis的用法进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2014-02-02
  • PHP封装函数实现生成随机的字符串验证码

    PHP封装函数实现生成随机的字符串验证码

    这篇文章主要介绍了利用PHP封装函数实现生成随机的字符串验证码的相关资料,文中给出了详细的介绍的示例代码,对大家具有一定的参考价值,有需要的朋友们可以一起来学习学习。
    2017-01-01
  • php中rsort函数实例用法

    php中rsort函数实例用法

    在本篇文章里小编给大家分享的是一篇关于php中rsort函数实例用法内容,有兴趣的朋友们可以学习下。
    2021-01-01
  • 基于PHP文件操作的详解

    基于PHP文件操作的详解

    本篇文章是对PHP文件操作的应用进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • php搜索文件程序分享

    php搜索文件程序分享

    php文件查找程序,输入一个路径确定后会遍历目录下所有的文件和文件夹,通过递归可以找到文件夹下面的每一个文件,再通过文件名和输入的关键字匹配,则可以查找到你想要的文件,需要的朋友可以参考下
    2015-10-10
  • php判断文件上传类型及过滤不安全数据的方法

    php判断文件上传类型及过滤不安全数据的方法

    这篇文章主要介绍了php判断文件上传类型及过滤不安全数据的方法,可实现对$_COOKIE、$_POST、$_GET中不安全字符的过滤功能,非常具有实用价值,需要的朋友可以参考下
    2014-12-12
  • PHP垃圾回收机制超详细介绍

    PHP垃圾回收机制超详细介绍

    垃圾回收机制是一种动态存储分配的方案。它会自动释放程序不再需要的已分配的内存块。垃圾回收机制可以让程序员不必过分关心程序内存分配,从而将更多的精力投入到业务逻辑
    2022-08-08

最新评论