资讯专栏INFORMATION COLUMN

一次php脚本执行过程中多次实例化PDO的情景分析

ivyzhang / 3299人阅读

摘要:所以我们在编程过程中,应该避免多次实例化,而产生不必要的数据库性能消耗。解决方案封装一个单例模式的类,该类实例化的过程就是创建连接的过程。当脚本中再次执行不带参数的连接时,还会再次产生一个新的数据库连接。

情景分析

脚本代码:


CLI执行:

root@78ad0df34cef:/home/www/test# php index.php
连接成功1
连接成功2
连接成功3
保持连接中...
执行结束

在脚本sleep过程中,我们查看mysql的连接信息:

mysql> show processlist;
+----+------+-----------+------+---------+------+----------+------------------+
| Id | User | Host      | db   | Command | Time | State    | Info             |
+----+------+-----------+------+---------+------+----------+------------------+
|  3 | root | localhost | NULL | Query   |    0 | starting | show processlist |
| 24 | root | localhost | test | Sleep   |    6 |          | NULL             |
| 25 | root | localhost | test | Sleep   |    6 |          | NULL             |
| 26 | root | localhost | test | Sleep   |    6 |          | NULL             |
+----+------+-----------+------+---------+------+----------+------------------+
4 rows in set (0.00 sec)

可以看到一个脚本的执行产生了三个数据库连接,但是如果将后面的实例化的pdo实例赋值给之前实例化的pdo实例,则新的连接会替换掉前一个连接,而不会产生新的连接。所以我们在编程过程中,应该避免多次实例化pdo,而产生不必要的数据库性能消耗。

解决方案

封装一个单例模式的类,该类实例化的过程就是创建pdo连接的过程。我们要建立数据库连接时,不是手动实例化pdo,而是去获取这个类的实例。

实例化pdo类时,设定 持久连接 参数:

 true
));
?>

PHP官方文档的引用:

很多 web 应用程序通过使用到数据库服务的持久连接获得好处。持久连接在脚本结束后不会被关闭,且被缓存,当另一个使用相同凭证的脚本连接请求时被重用。持久连接缓存可以避免每次脚本需要与数据库回话时建立一个新连接的开销,从而让web 应用程序更快。

官方所说的脚本结束,在fpm模式下就是指一次客户端请求的结束另一个使用相同凭证的脚本也就可以对应成另一个使用相同数据库连接凭证的客户端请求。首先我们要知道,这两次客户端的请求是根据fpm-workers的空闲情况,被分配给某个worker去执行的,所以两次请求被分配到同一个worker的可能性很低。接着,我们阐明下面的情景。

开启持久连接之后,数据库连接是被缓存于fpm进程之中的。如果某个fpm-worker进程中已经缓存了持久连接,此时可能出现如下两种情况:

当脚本中再次执行带 ATTR_PERSISTENT 参数的pdo连接时,会复用之前的连接,而不会产生新的连接。

当脚本中再次执行不带 ATTR_PERSISTENT 参数的pdo连接时,还会再次产生一个新的数据库连接。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/28395.html

相关文章

  • (唯一合适) PDO 教程

    摘要:是什么首先思考为什么选择是一个数据访问抽象层抽象是双重的一个是众所周知但不太重要的另一个是模糊的但是是最重要的众所周知为不同的数据库提供了统一的接口虽然这个功能本身很庞大但是对于固定程序来说不是过于重要的事情基本所有的程序都是使用统一的后端 PDO是什么 首先思考, 为什么选择PDO PDO 是一个数据访问抽象层(Database Access Abstraction Layer). ...

    sf190404 评论0 收藏0
  • php安全问题思考

    摘要:用户提交过来的数据都是不可信的,所以,在查库或入库前需要对提交过来的数据进行过滤或字符的转换处理,以防止注入或攻击等问题。 用户提交过来的数据都是不可信的,所以,在查库或入库前需要对提交过来的数据进行过滤或字符的转换处理,以防止SQL注入或xss攻击等问题。 一、防止SQL注入 什么是SQL注入攻击? 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字...

    alphahans 评论0 收藏0
  • 写一个“特殊”查询构造器 - (前言)

    摘要:而在项目开发中,我们想要的是一个更好用的可维护的工具,此时,对代码的封装模块化就显得尤为重要,于是出现了两种方案查询构造器,对象关系映射。典型环境下按照一般的查询构造器处理就行。 文章目录 写一个特殊的查询构造器 - (前言) 写一个特殊的查询构造器 - (一、程序结构,基础封装) 写一个特殊的查询构造器 - (二、第一条语句) 写一个特殊的查询构造器 - (三、条件查询) 写一个特殊...

    GitChat 评论0 收藏0
  • 一个 16年毕业生所经历 PHP 面试

    摘要:正确做法是给加索引,还有联合索引,并不能避免全表扫描。 前言:有收获的话请加颗小星星,没有收获的话可以 反对 没有帮助 举报三连 有心的同学应该会看到我这个noteBook下面的其它知识,希望对你们有些许帮助。 本文地址 时间点:2017-11 一个16年毕业生所经历的php面试 一、什么是面试 二、面试准备 1. 问:什么时候开始准备? 2. 问:怎么准备? 三、面试...

    dabai 评论0 收藏0

发表评论

0条评论

ivyzhang

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<