Jtti广告广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >php封装pdo实例以及pdo长连接的优缺点总结
  • 594
分享到

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

php 封装 pdo 2015-01-28 22:01:51 594人浏览 无得
摘要

一、前言 最近需要写脚本来实现崩溃日志的入库,不出所料又是脱离于框架的,那么行吧,咱们只能自己封装数据库相关操作了。博主这里选择了封装pdo操作数据库相关。 二、为什么选择pdo 众所周知的,PHP在早期的时候是带有Mysql扩展的,但是后

一、前言

最近需要写脚本来实现崩溃日志的入库,不出所料又是脱离于框架的,那么行吧,咱们只能自己封装数据库相关操作了。博主这里选择了封装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的配置方法
    这篇文章主要讲解了“PHP及PDO的配置方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP及PDO的配置方法”吧!1 DM PHP及PDO配置方法1....
    323
    2023-05-30
    pdo php
  • PHP中的PDO操作指南
    在PHP中,使用PDO操作数据库可以提高代码的安全性和移植性。PDO是一种PHP的扩展,为数据库访问提供了一个统一的接口,支持多种数据库类型。本文将为大家介绍PDO的基本用法和注意事项。1.连接数据库使用PDO连接数据库需要提供以下参数:$...
    738
    2023-05-30
    PHP pdo 操作指南
  • php 中怎么使用pdo连接数据库
    本篇文章为大家展示了php 中怎么使用pdo连接数据库,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。要用php连接数据库首先要要实例化pdo的类,并且要有数据源,服...
    226
    2023-05-30
    php pdo
  • 如何用php pdo连接数据库
    本篇内容介绍了“如何用php pdo连接数据库”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!要用php连接...
    920
    2023-05-30
    pdo php
  • js中Ajax的作用、优缺点以及实例用法
    本篇内容主要讲解“js中Ajax的作用、优缺点以及实例用法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“js中Ajax的作用、优缺点以及实例用法”吧!js中的A...
    203
    2023-05-30
    javascript ajax
  • 怎么让php支持pdo_mysql
    本篇内容主要讲解“怎么让php支持pdo_mysql”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么让php支持pdo_mysql”吧!1.pdo_mysql...
    686
    2023-05-30
    php pdo_mysql
  • php pdo 错误处理怎么设置
    本教程操作环境:windows7系统、PHP8.1版、Dell G3电脑。php PDO异常处理详解异常处理:PHP:默认为直接报错MYSQL:默认为静默模式,错就错,不报错PDO:默认为静默模式,错就错,不报错以前,当PHP碰到错误的时候...
    927
    2023-05-30
    pdo php
  • PHP入门指南:PDO数据库
    PHP是一门非常流行的服务器端编程语言,其灵活性和易用性使其成为Web开发的首选语言之一。在Web应用程序开发中,与数据库交互的过程是非常重要的,PDO(PHP Data Object)是PHP的一个扩展库,用于提供一个通用的接口来与多种关...
    734
    2023-05-30
    数据库 PHP PDO (PHP Data Objects)
  • win10 php安装pdo扩展
    在web开发人员的日常工作中,PHP作为一种极为流行的服务器侧语言,使用广泛。然而,如果要使用PHP连接数据库,则需要使用PDO扩展。在Windows 10上安装PDO扩展可能有些困难,因此本文将提供一些简单的步骤和提示,以帮助您顺利安装P...
    240
    2023-05-30
  • PHP PDO预处理语句及事务的使用
    目录预处理语句功能事务能力总结预处理语句功能 预处理语句就是准备好一个要执行的语句,然后返回一个 PDOStatement 对象。一般我们会使用 PDOStatement 对象的 ...
    366
    2023-05-30
    PHP PDO PHP 预处理语句 PHP 事务
  • JS中的六种继承方式以及优缺点总结
    目录前言原型链继承 构造函数继承 组合继承(原型链继承和构造函数继承组合) 寄生式继承 组合寄生式继承 extends继承 总结前言 继承是JS世界中必不可少的一个环节,号称JS的三...
    346
    2023-05-30
    js继承方式及其优缺点 javascript继承方式 js的继承方式有哪些
  • pdo如何防范sql注入
    pdo防范sql注入的方法:在对应的文件中添加以下代码:$dbh = new PDO('mysql:dbname=dbtest;host=127.0.0.1;charset=utf8', 'user', 'pass');$dbh->setA...
    536
    2023-05-30
    sql注入
  • MHA工具的优缺点归纳总结
    MHA(Master High Availability)目前在MySQL高可用方面是一个相对成熟的解决方案,它由日本DeNA公司youshimaton(现就职于Facebook公司)开发,是一套优秀的作为...
    163
    2023-05-30
    mha 工具 优缺点
  • php fpm没有pdo模块怎么办
    本教程操作环境:windows7系统、PHP8.1版、Dell G3电脑。php fpm没有pdo模块怎么办?找到php.ini配置文件:在737行设置extension_dir = "../php/ext"登录后复制在...
    122
    2023-05-30
    pdo php
  • Lombok的详细使用及优缺点总结
    什么是Lombok Lombok是一款Java开发插件,可以通过它定义的注解来精简冗长和繁琐的代码,主要针对简单的Java模型对象(POJO)。 好处就显而易见了,可以节省大量重复工...
    671
    2023-05-30
    Lombok使用 Lombok优缺点
  • php实现pdo数据库操作类过程详解
    目录数据库操作类的优点代码调用数据库表格结构SQL数据库操作类的优点 优点可以说是非常多了,常见的优点就是便于维护、复用、高效、安全、易扩展。例如PDO支持的数据库类型是非常多的,与...
    556
    2023-05-30
    php pdo数据库 php操作pdo数据库
  • php PDO导入数据库失败怎么办
    本教程操作环境:windows7系统、PHP8.1版、Dell G3电脑。php PDO导入数据库失败怎么办?显示错误消息,表明你已经连接到数据库罚款,但该项目数据库尚未选定。可以肯定它试图用正确的DSN改正,我会尝试改变连接字符串直接包含...
    826
    2023-05-30
    pdo php
  • PHP数据库学习之详解PDO的基本用法
    PHP PDO是PHP数据库扩展中的一种重要组件,它为PHP与多种关系型数据库提供了统一的API,使用PDO可以让我们的程序更加安全、高效、易于维护。在本文中,我们将介绍PHP PDO的用法,包括如何连接数据库、执行SQL语句、事务处理等方...
    344
    2023-05-30
    php pdo
  • PHP如何初始化PDO及原始SQL语句操作
    目录PDO 实例dns 参数PDO 对象属性查询语句普通查询及遍历查询结果集(数组、对象)查询结果集(类)查询结果集(指定字段)增、删、改操作增加操作修改操作删除操作总结PDO 实例...
    600
    2023-05-30
    PHP 初始化PDO PHP 操作sql
  • Redis和Memcache以及MongoDb的优缺点与区别
    这篇文章给大家介绍Redis和Memcache以及MongoDb的优缺点与区别,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。  memcache、redis和MongoDB都是非关系型...
    552
    2023-05-30
    redis memcache mongodb
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作