首页 > 作文

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

更新时间:2023-04-04 13:00:25 阅读: 评论:0

一、前言

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

二、为什么选择pdo

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

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

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

三、pdo的长连接

1、什么是pdo的长连接

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

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

$pdo = new pdo($dsn, $urname, $passwd, [pdo::attr_persistent => true]);

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

2、长连接对nginx无效吗

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

参考文章:

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

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

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

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

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

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

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

4、长连接对事务的影响

参考博文地址:/d/file/titlepic/blockquotep总结: 如果业务并发比较大且带有事务,不建议使用长连接的方式。

5、总结

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

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

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

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

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

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

四、pdo部分demo的封装

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

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

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

1、断线重连机制

例如重连函数:

/** * @params:重连函数,上限3次 * @date:2020/3/18 * @time:17:03 */public function customconnect(){    try {        $this->pdo = new pdo($this->config['dsn'], $this->config['urname'], $this->confi世袭制g['password'], $this->config['params']);        $this->pdo->tattribute(pdo::attr_errmode, pdo::errmode_exception); //需要将错误处理模式变成异常模式        return true;    } catch (exception $e) {        if (stripos($e->getmessage(), 'mysql rver has gone away') !== fal || stripos($e->getmessage(),' bytes failed with errno=10053') !==fal) {            $this->clo();            $this->trynums++;            if ($this->trynums > 3) {                return fal;            }            lf::customconnect();        } el {            $this->throw_exception($e->getmessage());            return fal;        }    }}

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

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

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

//自定义warnings处理函数t_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、析构方法回收资源

/** * destruct 关闭数据库连接 */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长连接优缺点分析内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

本文发布于:2023-04-04 12:59:52,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/3e3f0bbf75de4e494a18a6b583fe8d07.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:php封装pdo实例以及pdo长连接的优缺点总结.doc

本文 PDF 下载地址:php封装pdo实例以及pdo长连接的优缺点总结.pdf

标签:错误   进程   操作   数据库
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图