广告
返回顶部
首页 > 资讯 > 后端开发 > PHP编程 >PHP如何封装pdo
  • 832
分享到

PHP如何封装pdo

2023-06-22 03:06:38 832人浏览 泡泡鱼
摘要

这篇文章主要介绍了PHP如何封装pdo,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、前言最近需要写脚本来实现崩溃日志的入库,不出所料又是脱离于框架的,那么行吧,咱们只能自

这篇文章主要介绍了PHP如何封装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.cnblogs.com/wpjamer/articles/7106389.html

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

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

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

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

参考博文地址:Https://hacpai.com/article/1526490593632

结论:
      事实证明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错误,而这个错误是phpwarnings级别错误,try..catch根本就捕获不到,所以博主这里自定义错误处理函数来处理。

这部分是转化phpwarnings错误为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        }

感谢你能够认真阅读完这篇文章,希望小编分享的“PHP如何封装pdo”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网PHP编程频道,更多相关知识等着你来学习!

--结束END--

本文标题: PHP如何封装pdo

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • PHP如何封装pdo
    这篇文章主要介绍了PHP如何封装pdo,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、前言最近需要写脚本来实现崩溃日志的入库,不出所料又是脱离于框架的,那么行吧,咱们只能自...
    99+
    2023-06-22
  • php封装pdo实例以及pdo长连接的优缺点总结
    一、前言 最近需要写脚本来实现崩溃日志的入库,不出所料又是脱离于框架的,那么行吧,咱们只能自己封装数据库相关操作了。博主这里选择了封装pdo操作数据库相关。 二、为什么选择pdo 众所周知的,php在早期的时候是带有mysql扩展的,但是后...
    99+
    2015-01-28
    php 封装 pdo
  • php如何封装app
    小编给大家分享一下php如何封装app,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!php封装app的方法:1、创建json.php文件和demo.php文件;2...
    99+
    2023-06-21
  • Linux下如何安装PHP的PDO
    这篇“Linux下如何安装PHP的PDO”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Linux下如何安装PHP的PDO”文...
    99+
    2023-06-27
  • Centos中如何安装PHP的PDO扩展
    这篇文章主要介绍“Centos中如何安装PHP的PDO扩展”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Centos中如何安装PHP的PDO扩展”文章能帮助大家解决问题。环境:服务器系统:Cento...
    99+
    2023-06-27
  • Linux上如何安装PHP PDO扩展库
    这篇文章主要介绍了Linux上如何安装PHP PDO扩展库,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。PDO是一个用于访问数据库的轻量级接口,它提供了数据库抽象层,让我们的...
    99+
    2023-06-27
  • centos7怎么安装php-pdo
    本文操作环境:centos7系统、php5.4.16&&mariadb5.5.52版、Dell G3电脑。centos7怎么安装php-pdocentos7 php(mariadb)安装pdo在centos7环境下安装PDO...
    99+
    2017-04-22
    centos7 php-pdo
  • win10 php安装pdo扩展
    在web开发人员的日常工作中,PHP作为一种极为流行的服务器侧语言,使用广泛。然而,如果要使用PHP连接数据库,则需要使用PDO扩展。在Windows 10上安装PDO扩展可能有些困难,因此本文将提供一些简单的步骤和提示,以帮助您顺利安装P...
    99+
    2023-05-24
  • java封装类是如何封装的
    在Java中,封装是一种面向对象编程的概念,用于隐藏内部实现细节,并通过公共方法提供对数据的访问和操作。封装类是为了封装基本数据类型...
    99+
    2023-10-23
    java
  • Golang如何封装PHP常用函数
    本文小编为大家详细介绍“Golang如何封装PHP常用函数”,内容详细,步骤清晰,细节处理妥当,希望这篇“Golang如何封装PHP常用函数”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。Golang实现PHP常用...
    99+
    2023-06-28
  • 如何在PHP中实现封装性
    封装性是面向对象编程的一个重要概念,它可以提高代码的可维护性和可复用性。在 PHP 中,我们可以通过以下几个方法来实现封装性。访问控制PHP 提供了三种访问修饰符来实现封装性:public、protected 和 private。publi...
    99+
    2023-10-21
    PHP 实现 (Implementation) 封装性 (Encapsulation)
  • docker封装镜像(PHP)
    一、环境介绍 操作系统:centos 7.9 cpu:4核心 内存:8GB docker版本:20.10.17 二、docker commit命令封装镜像 1、拉取centos 7.9镜像 注:需求不...
    99+
    2023-09-13
    docker 运维 linux
  • php封装json乱码
    随着web应用的发展,前后端之间交换数据的方式也越来越多样化。其中,JSON格式特别得到了广泛应用。在PHP开发中,封装JSON数据并不难。然而,在封装过程中,有时会遇到JSON数据乱码的问题。本文将介绍PHP封装JSON数据时可能会遇到的...
    99+
    2023-05-24
  • php中PDO对象如何安装配置与使用
    这篇文章将为大家详细讲解有关php中PDO对象如何安装配置与使用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。对PDO对象的认识1.1 简介PHP 数据对象 (PDO) 扩展为PHP访问数据库定义了一个轻...
    99+
    2023-06-22
  • golang如何封装
    在Go语言中,封装指的是把数据和操作数据的方法绑定在一起,形成一个独立的单元,从而避免外部使用者直接访问数据,保证数据安全和操作的有效性。本文将介绍如何在Go语言中实现封装。可见性控制在Go语言中,可见性控制通过命名来实现。如果一个变量或者...
    99+
    2023-05-19
  • 如何封装ajax
    小编给大家分享一下如何封装ajax,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! 以前开发用了很多AJAX的技术比如EXT,prototype,jQuery等...
    99+
    2022-10-19
  • php pdo如何设置utf8
    本篇内容介绍了“php pdo如何设置utf8”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!php pdo设置utf8的方法:1、打开相应的...
    99+
    2023-06-21
  • linux php怎么安装pdo-oci扩展
    本文操作环境:linux5.9.8系统、php 7.1.25版、DELL G3电脑linux php怎么安装pdo-oci扩展linux下安装php扩展pdo_oci和oci8:此次安装扩展耗费了我大半天的时间,特此记录其中的安装过程,希望...
    99+
    2016-12-14
    linux php pdo-oci
  • php封装app的方法
    本文操作环境:windows7系统、PHP7.4版、DELL G3电脑使用php封装APP接口php封装APP接口我们先来介绍Json的封装方法 json_encode函数传递中文的话,输出后是乱码的,针对这个问题我觉得有必要做一个解释: ...
    99+
    2016-12-05
    php app
  • vue3如何封装axios
    本文小编为大家详细介绍“vue3如何封装axios”,内容详细,步骤清晰,细节处理妥当,希望这篇“vue3如何封装axios”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。简介axios是一个基于promise的网...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作