• 售前

  • 售后

热门帖子
入门百科

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

[复制链接]
阿阳937 显示全部楼层 发表于 2022-1-9 09:09:30 |阅读模式 打印 上一主题 下一主题
一、媒介

最近必要写脚本来实现崩溃日志的入库,不出所料又是离开于框架的,那么行吧,咱们只能本身封装数据库相关操纵了。博主这里选择了封装pdo操纵数据库相关。
二、为什么选择pdo

众所周知的,php在早期的时候是带有mysql扩展的,但是后来由于过于古老缺失了mysql的新特性,因此主键没落。
从php5开始,更发起各人利用mysqli扩展,这个是mysql扩展的增强版,是一个面向对象的MySQL接口,更容易利用。缺点是只能操纵mysql,不敷强大。
另有就是pdo扩展了,这个是最丰富的的一个扩展,支持多种数据库,重要的是,在安全上是比其他两种扩展都要强的,通过利用prepared预处置处罚更是有效的防止sql注入。因此,博主这里选择了封装pdo相关的操纵。
三、pdo的长毗连

1、什么是pdo的长毗连

长毗连顾名思义就是一直保持毗连,相对于寻常的短毗连,每次请求都会重新创建链接来说,长毗连可以有效的淘汰创建的过程,可以更好的节省性能。
在操纵上是在毗连数据库的时候,多加一个参数:
  1. $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、长毗连对事故的影响
  1. 参考博文地址: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、断线重连机制


例如重连函数:
  1. /**
  2. * @params:重连函数,上限3次
  3. * @date:2020/3/18
  4. * @time:17:03
  5. */
  6. public function customConnect()
  7. {
  8.     try {
  9.         $this->pdo = new PDO($this->config['dsn'], $this->config['username'], $this->config['password'], $this->config['params']);
  10.         $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //需要将错误处理模式变成异常模式
  11.         return true;
  12.     } catch (Exception $e) {
  13.         if (stripos($e->getMessage(), 'MySQL server has gone away') !== false || stripos($e->getMessage(),' bytes failed with errno=10053') !==false) {
  14.             $this->close();
  15.             $this->tryNums++;
  16.             if ($this->tryNums > 3) {
  17.                 return false;
  18.             }
  19.             self::customConnect();
  20.         } else {
  21.             $this->throw_exception($e->getMessage());
  22.             return false;
  23.         }
  24.     }
  25. }
复制代码
2、转化php warnings为try…catch可捕捉的错误


这步原因是长毗连会频繁的造成mysql gone away错误,而这个错误是php 的warnings级别错误,try..catch根本就捕捉不到,所以博主这里自界说错误处置处罚函数来处置处罚。
这部门是转化php的warnings错误为try..catch可以捕捉的error错误,关于php的报错机制以及错误处置处罚这块,咱们下篇再讨论。
  1. //自定义warnings处理函数set_error_handler('customException');//拿到warnngs错误之后,转化为error错误抛出,这样就可以被try..catch捕获function customException( $error_no, $error_msg, $error_file, $error_line){
  2.     throw new \Exception($error_msg,0,null);
  3.     //throw new \Exception($error_msg);}
复制代码
3、析构方法回收资源
  1. /**
  2. * destruct 关闭数据库连接
  3. */
  4. public function destruct()
  5. {
  6.     $this->pdo = null;
  7. }
复制代码
4、query的时候ping一下
  1. public function query($sql = null, $param = null)
  2.   {
  3.       //检测连接是否活跃
  4.       $this->pdo_ping();
  5.       //判断之前是否有结果集
  6.       if (!empty($this->PDOStatement)) {
  7.           $this->free();
  8.       }
  9.       xxxxxxxxxx        }
复制代码
5、下载所在


这四步美满之后,这个pdo的类还是可以用的,各人必要的话可以去百度云上下载。
  1. 链接: https://pan.baidu.com/s/1Siz_bKlhEIVNV99Y0zTzqw 提取码: ebqx
复制代码
到此这篇关于php封装pdo实例以及pdo长毗连的优缺点总结的文章就先容到这了,更多相关php封装pdo实例及pdo长毗连优缺点分析内容请搜索脚本之家从前的文章或继续欣赏下面的相关文章盼望各人以后多多支持脚本之家!

帖子地址: 

回复

使用道具 举报

分享
推广
火星云矿 | 预约S19Pro,享500抵1000!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

草根技术分享(草根吧)是全球知名中文IT技术交流平台,创建于2021年,包含原创博客、精品问答、职业培训、技术社区、资源下载等产品服务,提供原创、优质、完整内容的专业IT技术开发社区。
  • 官方手机版

  • 微信公众号

  • 商务合作