php封装pdo实例以及pdo长连接的优缺点总结

一、前言

最近需要写脚本来实现崩溃日志的入库,不出所料又是脱离于框架的,那么行吧,咱们只能自己封装数据库相关操作了。博主这里选择了封装pdo操作数据库相关。

二、为什么选择pdo

众所周知的,PHP在早期的时候是带有Mysql扩展的,但是后来由于过于古老缺失了mysql的新特性,因此主键没落。

php5开始,更建议大家使用mysqli扩展,这个是mysql扩展的增强版,是一个面向对象的MySQL接口,更容易使用。缺点是只能操作mysql,不够强大。

还有就是pdo扩展了,这个是最丰富的的一个扩展,支持多种数据库,重要的是,在安全上是比其他两种扩展都要强的,通过使用prepared预处理更是有效的防止sql注入。因此,博主这里选择了封装pdo相关的操作。

三、pdo的长连接

1、什么是pdo的长连接

长连接顾名思义就是一直保持连接,相对于平时的短连接,每次请求都会重新创建链接来说,长连接可以有效的减少创建的过程,可以更好的节省性能。

在操作上是在连接数据库的时候,多加一个参数:


$pdo = new PDO($dsn, $username, $passwd, [PDO::ATTR_PERSISTENT => true]);

后面的PDO::ATTR_PERSISTENT => true 就是开启长连接的方法。

2、长连接对Nginx无效吗

博主在搜索长连接相关知识的时候,看到一篇文章,结论是长连接仅适用于apache,不适用于nginx,这是真的吗?

参考文章:https://www.jb51.net/article/133709.htm

大致结论是:长连接更多的是针对于apache的,因为apache维护一个进程池,开启了apache mpm功能之后,apache会默认维持一个进程池,mysql长连接之后的连接,并没有作为socet连接关闭,而是作为一个不释放的东西,放进了进程池/线程池里面去。

而对于nginx来说,长连接是无效的,脚本执行结束则释放资源?

3、php-fpm下的长连接测试

这里前辈已经测试过了,咱们给出前辈的地址,大家有兴趣的可以看看

结论:
事实证明php-fpm是可以实现长连接的,只是如果该进程空闲的话,会造成资源浪费。

php-fpm的配置文件可以考虑设置pm.max_requests = 1000,代表每一个子进程的最大请求服务数量,如果超过了这个值,该子进程会被自动重启。

比如max_requests这个参数,如果设置很大的话,那这个子进程要运行很多次才会重启,假如这个请求发生了错误或者内存泄漏,那么这个值设置很大是不合适的。但如果请求没有问题,这个值设置小的话就会频繁的重启,这样也会碰到不少502的问题,所以要仁者见仁,智者见智的设置了,这里初始化设置1000,如果测试没有内存泄漏等问题,可以再大一些。

4、长连接对事务的影响

参考博文地址:Https://www.zhihu.com/question/62603122

总结: 如果业务并发比较大且带有事务,不建议使用长连接的方式。

5、总结

博主在不断的搜索中,发现长连接要发挥出最佳性能始终是避不开连接池这点的,而php恰恰又不能很好的实现连接池,这点确实是有点小遗憾。

整体来说在php中是暂时无法配置和mysql的完美连接池的,在业务比较复杂的地方,还是谨慎试用长连接,每个连接都是1个线程,会造成大量的资源浪费。

如果是某些业务需要持续的数据库操作,比如提交日志接口等,那么是可以考虑打开长连接的,记得设置max_requests来定量关闭php-fpm连接,fpm关闭之后也会自动释放mysql的连接。

还有pm.max_spare_servers设置服务器空闲时最大php-fpm进程数量。

例如: pm.max_spare_servers = 25 如果空闲时,会检查进程数,多于25个了,就会关闭几个,达到25个的状态。

擅长swoole的同学,可以参考这篇文章:
基于swoole扩展实现真正的PHP数据库连接池

四、pdo部分demo的封装

首先这部分博主是参考了一个网友的封装,GitHub地址如下:

https://github.com/nadirvishun/php-pdo-class

这个网友基本的增删改查都封装好了,而且都有参数预处理,安全性还是可以的。不过既然作为一个基准的类,还是缺少一些东西。

1、断线重连机制

例如重连函数:



public function customConnect()
{
    try {
        $this->pdo = new PDO($this->config['dsn'], $this->config['username'], $this->config['passWord'], $this->config['params']);
        $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //需要将错误处理模式变成异常模式
        return true;
    } catch (Exception $e) {
        if (stripos($e->getMessage(), 'MySQL Server has Gone away') !== false || stripos($e->getMessage(),' bytes failed with errno=10053') !==false) {
            $this->close();
            $this->tryNums++;
            if ($this->tryNums > 3) {
                return false;
            }
            self::customConnect();
        } else {
            $this->throw_exception($e->getMessage());
            return false;
        }
    }
}

2、转化php warnings为try…catch可捕获的错误

这步原因是长连接会频繁的造成mysql gone away错误,而这个错误是php 的warnings级别错误,try..catch根本就捕获不到,所以博主这里自定义错误处理函数来处理。

这部分是转化php的warnings错误为try..catch可以捕获的error错误,关于php的报错机制以及错误处理这块,咱们下篇再讨论。


//自定义warnings处理函数set_error_handler('customException');//拿到warnngs错误之后,转化为error错误抛出,这样就可以被try..catch捕获function customException( $error_no, $error_msg, $error_file, $error_line){
    throw new \Exception($error_msg,0,null);
    //throw new \Exception($error_msg);}

3、析构方法回收资源



public function destruct()
{
    $this->pdo = null;
}

4、query的时候ping一下


public function query($sql = null, $param = null)
  {
      //检测连接是否活跃
      $this->pdo_ping();
      //判断之前是否有结果集
      if (!empty($this->PDOStatement)) {
          $this->free();
      }
      xxxxxxxxxx        }

5、下载地址

这四步完善之后,这个pdo的类还是可以用的,大家需要的话可以去百度云上下载。

链接: https://pan.baidu.com/s/1Siz_bKlhEIVNV99Y0zTzqw 提取码: ebqx

到此这篇关于php封装pdo实例以及pdo长连接的优缺点总结的文章就介绍到这了,更多相关php封装pdo实例及pdo长连接优缺点分析内容请搜索编程界以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程界!

--结束END--

本文标题: php封装pdo实例以及pdo长连接的优缺点总结

本文链接: https://www.lsjlt.com/news/28.html (转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢

  • php封装pdo实例以及pdo长连接的优缺点总结

    一、前言最近需要写脚本来实现崩溃日志的入库,不出所料又是脱离于框架的,那么行吧,咱们只能自己封装数据库相关操作了。博主这里选择了封装pdo操作数据库相关。二、为什么选择pdo众所周知的,php在早期的时候是带有mysql扩展的,但是后来由于过于古老缺失了mys
    阅读数:594 php 封装 pdo
  • 原生php pdo几个处理

    闲来无事,便记录几个最近遇到的Pdo细节问题,平常都是用orm的。长连接在历史的Mysql驱动中,都是使用connect和pconnect来区分长短连接,到了pdo之后,改成了参数。PDO::ATTR_PERSISTENT $dbh = new PDO(MYS
    阅读数:553 原生php pdo几个处理
  • PHP操作mysql(mysqli + PDO)

    【Mysqli面向对象方式操作数据库】添加、修改、删除数据$mysqli = new mysqli("localhost","root","123456","test");$mysqli->query("set names utf8");//添加数据$resu
    阅读数:639 PHP操作mysql(mysqli + PDO)
  • PHP及PDO的配置方法

    这篇文章主要讲解了“PHP及PDO的配置方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP及PDO的配置方法”吧!1 DM PHP及PDO配置方法1.1 软硬件环境类别版本安装路径操作
    阅读数:319 pdo php
  • php 中怎么使用pdo连接数据库

    本篇文章为大家展示了php 中怎么使用pdo连接数据库,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。要用php连接数据库首先要要实例化pdo的类,并且要有数据源,服务器账号,服务器密码。  数据源是
    阅读数:219 php pdo
  • 如何用php pdo连接数据库

    本篇内容介绍了“如何用php pdo连接数据库”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!要用php连接数据库首先要要实例化pdo的类,并
    阅读数:904 pdo php
  • php pdo怎么设置utf8

    php pdo设置utf8的方法:1、打开相应的PHP代码文件;2、通过“$this->pdo->prepare("set names utf8");”设置utf8编码即可。
    阅读数:259 php pdo tf8
  • 怎么让php支持pdo_mysql

    本篇内容主要讲解“怎么让php支持pdo_mysql”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么让php支持pdo_mysql”吧!1.pdo_mysql包 wget http://pec
    阅读数:671 php pdo_mysql
  • php pdo 错误处理怎么设置

    php pdo错误处理设置方法:1、设置“PDO::ERRMODE_SILENT”,然后以“$pdo->errorInfo()”的形式获取错误信息;2、设置“PDO::ERRMODE_WARNING”,查看“E_WARNING”错误;3、设置“PDO::ERRMODE_EXCEPTION”,然后以“try{}cath(){}”输出错误信息。
    阅读数:906 pdo php
  • centos7怎么安装php-pdo

    centos7安装php-pdo的方法:1、安装PHP和mariadb;2、执行“yum install php-mysqlnd”命令;3、执行“/bin/systemctl restart httpd”。
    阅读数:666 centos7 php-pdo
  • linux php怎么安装pdo-oci扩展

    linux php安装pdo-oci扩展的方法:1、安装Oracle客户端;2、进入php的源码安装包,执行make;3、在php.ini配置中添加一句“extension=pdo_oci.so”即可。
    阅读数:418 linux php pdo-oci
  • PHP PDO预处理语句及事务的使用

    今天这篇文章,我们来简单的学习一下 PDO 中的预处理语句以及事务的使用,它们都是在 PDO 对象下的操作,而且并不复杂,简单的应用都能很容易地实现。只不过大部分情况下,大家都在使用框架,手写的机会非常少。
    阅读数:365 PHP PDO PHP 预处理语句 PHP 事务
  • PHP数据库抽象层之PDO(二)——连接与连接管理

    连接是通过创建 PDO 基类的实例而建立的。不管使用哪种驱动程序,都是用 PDO 类名。构造函数接收用于指定数据库源(所谓的 DSN)以及可能还包括用户名和密码(如果有的话)的参数。Example #1 连接到 MySQL?php$d
  • php fpm没有pdo模块怎么办

    php fpm没有pdo模块的解决办法:1、找到并打开“php.ini”配置文件;2、在737行设置“extension_dir = "../php/ext"”;3、在907行设置“extension=pdo_mysql”即可。
    阅读数:122 pdo php
  • pdo中的预处理语法

    什么叫预处理语法就是,为了“重复执行”多条结构类似的sql语句,而将该sql语句的形式“进行预先处理”(编译);该sql语句的“形式”中,含有“未给定的数据项”。然后,到正式执行的时候,只要给定相应的形式上的“数据项”,就可以更快速方便执行。比如(有两种预定义
    阅读数:460 pdo中的预处理语法
  • pdo如何防范sql注入

    pdo防范sql注入的方法:在对应的文件中添加以下代码:$dbh = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass');$dbh->setA
    阅读数:517 sql注入
  • 怎么更改php.ini文件支持pdo抽象层

    方法:1、打开配置文件“php.ini”;2、查找“pdo_firebird”、“pdo_oci”、“pdo_odbc”、“pdo_pgsql”等PDO相关的配置信息,将配置项前面的分号“;”去除;3、重启Apache服务器即可。
    阅读数:934 php.ini 开启PDO pdo抽象层
  • php中值得收藏的PDO对象安装配置与使用

    注意:这一步在 PHP 5.3及更高版本中不是必须的,对于 PDO 不再需要做为一个 DLL 文件。
    阅读数:854 PHP PDO
  • ubuntu下安装php pdo扩展和导入数据库

    默认安装的php不存在pdo扩展,因此在使用到的时候会报错,直接使用这个命令apt-get install php-mysql就可以成功安装pdo扩展安装完数据库后需要导入sql语句,先进入数据库中提前创建数据库名,比如laykefu的数据库,-u-p
  • PHP如何初始化PDO及原始SQL语句操作

    PDO 已经是 PHP 中操作数据库事实上的标准。包括现在的框架和各种类库,都是以 PDO 作为数据库的连接方式。基本上只有我们自己在写简单的测试代码或者小的功能时会使用 mysqli 来操作数据库。注意,普通的 mysql 扩展已经过时了哦!
    阅读数:587 PHP 初始化PDO PHP 操作sql