在之前我们手写 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 也是可以关闭数据库连接的都不知道。框架在带给我们便利的同时,确实也将很多东西封装的太好了,以至于很多朋友都不去关心底层的一些内容,但是,当你向更高阶层迈进时,往往这些底层的东西会成为你的阻碍。

测试代码:

http://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

参考文档:

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

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

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

PHP中PDO关闭连接的方法问题的更多相关文章

  1. PHP设计模式之命令模式示例详解

    前言命令模式,也称为动作或者事务模式,很多教材会用饭馆来举例。作为顾客的我们是命令的下达者,服务员是这个命令的接收者......

  2. PHP文件操作简单介绍及函数汇总

    文件操作一直是Web程序员头疼的地方,而文件操作在CMS这样的系统中又是必须的。如今,PHP文件操作的函数内容已经非......

  3. php结合GD库实现中文验证码的简单方法

    前言上一次写了一个常见的验证码,现在玩一下中文的验证码,顺便升级一下写的代码流程基本差不多先看GD库开启了没生成中文......

  4. php中数组最简单的使用方法

    我们在说映射的时候,有些小伙伴就会联想到数组,没错,因为数组就是用了映射的思想。这里很多刚学php的小伙伴对概念不是......

  5. php swoft框架实例用法

    在框架选择上,不少人会觉得swoft才是最强PHP框架,尤其是在常驻内存模式的应用级高性能框架,性能是这一堆页面级框......

  6. php的curl携带header请求头信息实现http访问的方法

    导读:curl请求时添加请求头信息可以模拟真人操作,不容易被当成是爬虫机器人(采集),从而可以绕过Incapsula......

  7. php的lavarel框架中join和orWhere的用法

    Laravel是一个开源PHP框架,功能强大且易于理解。它遵循模型 - 视图 - 控制器设计模式(MVC)。Lara......

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

    在之前我们手写 mysql 的连接操作时,一般都会使用 mysql_close() 来进行关闭数据库连接的操作。不过......

随机推荐

  1. java 最新Xss攻击与防护(全方位360°详解)

    前沿XSS防范属于前端还是后端的责任 ?XSS 防范是后端 RD(研发人员)的责任,后端 RD 应该在所有用户提交数......

  2. php的curl携带header请求头信息实现http访问的方法

    导读:curl请求时添加请求头信息可以模拟真人操作,不容易被当成是爬虫机器人(采集),从而可以绕过Incapsula......

  3. java中throws实例用法详解

    在程序出现异常时,会有一个抛出异常的throw出现,这里我们要跟今天所讲的throws区分开。throws的作用是声......

  4. PHP文件操作简单介绍及函数汇总

    文件操作一直是Web程序员头疼的地方,而文件操作在CMS这样的系统中又是必须的。如今,PHP文件操作的函数内容已经非......

  5. php中数组最简单的使用方法

    我们在说映射的时候,有些小伙伴就会联想到数组,没错,因为数组就是用了映射的思想。这里很多刚学php的小伙伴对概念不是......

  6. JavaScript实现浏览器网页自动滚动并点击的示例代码

    1. 打开浏览器控制台窗口JavaScript通常是作为开发Web页面的脚本语言,本文介绍的JavaScript代码......

  7. 基于 Python 实践感知器分类算法

    Perceptron是用于二进制分类任务的线性机器学习算法。它可以被认为是人工神经网络的第一种和最简单的类型之一。绝......

  8. php结合GD库实现中文验证码的简单方法

    前言上一次写了一个常见的验证码,现在玩一下中文的验证码,顺便升级一下写的代码流程基本差不多先看GD库开启了没生成中文......

  9. javascript中call,apply,bind的区别详解

    在JS中,这三者都是用来改变函数的this对象的指向的,他们有什么样的区别呢。在说区别之前还是先总结一下三者的相似之......

  10. JavaScript中的Proxy对象

    Js中Proxy对象Proxy对象用于定义基本操作的自定义行为,例如属性查找、赋值、枚举、函数调用等。语法const......