搜索
首页后端开发PHP问题PHP如何用数据库连接池实现?

PHP如何用数据库连接池实现?

Jun 24, 2021 pm 02:35 PM
php数据库连接池

对于PHP程序而言,优化永无止境。而数据库连接池就在一定程度上起到了优化的作用。其使得对用户的每一个请求而言,无需每次都像数据库申请链接资源。而是通过已存在的数据库连接池中的链接来返回,从时间上,效率上,都是一个大大的提升。因此本篇文章就带领你们一起了解PHP如何用数据库连接池实现?

相关推荐:PHP数组中什么是查找算法?如何查找?

xml

XML作为一门高可用的结构化语言,作为配置文件真的是言简意赅,虽然相比于近来配置文件界的YAML, JSON等翘楚来说,可能有效数据的占比比较小,但是这种冗余是有其存在的价值的。

基本上,看完xml的节点就可以知道其功能。这也是为什么大项目都会使用XML作为配置文件的原因。

可以容忍冗余,但是不能带来一点歧义,或者维护困难方面的问题。

在PHP中,使用XML文件会是一件赏心悦目的事情,虽然相对于Java程序而言,如此。但是相比于Python处理,PHP程序就显得没有那么优雅了。

读取配置文件

读取配置文件其实说白了就是对文件的读取,然后包装一下。我常用的有如下两种方式。

简易方式

第一次使用这个简易方式的时候,真的是有点郁闷。

$content = file_get_contents("filename.xml");echo $content;

结果使用浏览器访问这个测试用的php文件时,却只显示了xml的内容部分,但是节点信息什么的根本没有显示。

然后我还特地查阅了一下帮助文档,这个函数返回的结果是字符串无疑的啊。然后vardump之后也证明了这一点。于是也没有多想,还以为这种方式能自动的过滤掉XML的标签TAG信息呢。

最后一个偶然的测试,打开了网页源代码,发现这个函数确实读到了XML的所有信息,只不过显示在浏览器上就会被浏览器给自动解析了。所以只能看到相关的内容部分。

常规方式

常规方式就是按部就班的读取文件了。其余的话和上述方案一致。

// 读取配置文件内容
            $handle = fopen("filepath", "r");            $content = fread($handle, filesize("filepath"));

PHP解析XML

上述两种读取文件,其实都是为了PHP解析XML来做准备的。关于PHP解析XML的方式的博客有很多。方式也有很多,像simplexml,XMLReader,DOM啦等等。但是对于比较小型的xml配置文件,simplexml就足够了。

配置文件

<?xml version="1.0" encoding="UTF-8" ?><mysql>
    <!-- 为防止出现意外,请按照此标准顺序书写.其实也无所谓了 -->
    <host>localhost</host>
    <user>root</user>
    <password>123456</password>
    <db>test</db>
    <port>3306</port></mysql>

解析

<?php
/**
 * 作为解析XML配置文件必备工具
 */
class XMLUtil {
    public static $dbconfigpath = "./db.config.xml";
    public static function getDBConfiguration() {
        $dbconfig = array ();
        try {
            // 读取配置文件内容
            $handle = fopen(self::$dbconfigpath, "r");
            $content = fread($handle, filesize(self::$dbconfigpath));
            // 获取xml文档根节点,进而获取相关的数据库信息
            $mysql = simplexml_load_string($content);

            // 将获取到的xml节点信息赋值给关联数组,方便接下来的方法调用
            $dbconfig[&#39;host&#39;] = $mysql->host;
            $dbconfig[&#39;user&#39;] = $mysql->user;
            $dbconfig[&#39;password&#39;] = $mysql->password;
            $dbconfig[&#39;db&#39;] = $mysql->db;
            $dbconfig[&#39;port&#39;] = $mysql->port;
            // 将配置信息以关联数组的形式返回
            return $dbconfig;
        } catch ( Exception $e ) {
            throw new RuntimeException ( "<mark>读取数据库配置文件信息出错!</mark><br />" );
        }
        return $dbconfig;
    }

数据库连接池

对于PHP程序而言,优化永无止境。而数据库连接池就在一定程度上起到了优化的作用。其使得对用户的每一个请求而言,无需每次都像数据库申请链接资源。而是通过已存在的数据库连接池中的链接来返回,从时间上,效率上,都是一个大大的提升。

于是,这里简单的模拟了一下数据库连接池的实现。核心在于维护一个“池”。

从池子中取,用毕,归还给池子。

<?php
/**x
 *  PHP中的数据库 工具类设计
 *  郭璞
 *  2016年12月23日
 *  
 **/
class DbHelper {
    private $dbconfig;
    private $dbpool;
    public $poolsize;
    public function __construct($poolsize = 20) {
        if (! file_exists ( "./utils.php" )) {
            throw new RuntimeException ( "<mark>utils.php文件丢失,无法进行配置文件的初始化操作!</mark><br />" );
        }else {
            require &#39;./utils.php&#39;;
        }
        // 初始化 配置文件信息
        $this->dbconfig = XMLUtil::getDBConfiguration ();

        // 准备好数据库连接池“伪队列”
        $this->poolsize = $poolsize;
        $this->dbpool = array ();
        for($index = 1; $index <= $this->poolsize; $index ++) {
            $conn = mysqli_connect ( $this->dbconfig [&#39;host&#39;], $this->dbconfig [&#39;user&#39;], $this->dbconfig [&#39;password&#39;], $this->dbconfig [&#39;db&#39;] ) or die ( "<mark>连接数据库失败!</mark><br />" );
            array_push ( $this->dbpool, $conn );
        }
    }

    /**
     * 从数据库连接池中获取一个数据库链接资源
     *
     * @throws ErrorException
     * @return mixed
     */
    public function getConn() {
        if (count ( $this->dbpool ) <= 0) {
            throw new ErrorException ( "<mark>数据库连接池中已无链接资源,请稍后重试!</mark>" );
        } else {
            return array_pop ( $this->dbpool );
        }
    }

    /**
     * 将用完的数据库链接资源放回到数据库连接池
     *
     * @param unknown $conn            
     * @throws ErrorException
     */
    public function release($conn) {
        if (count ( $this->dbpool ) >= $this->poolsize) {
            throw new ErrorException ( "<mark>数据库连接池已满</mark><br />" );
        } else {
            array_push ( $this->dbpool, $conn );
        }
    }
}

测试

申请过多时,拒绝请求

在申请数据库连接小于20的时候,程序直接从数据库连接池中获取。

正常请求,正常获取

当申请的数据库链接资源大于数据库连接池的上限时,不予提供。并提示异常。

数据库连接池中无连接转时提示异常

已满后拒绝放入

当数据库连接池内已满的时候,如果想回首自定义的数据库链接资源,则不予支持,并报错提示。
已满后拒绝放入

总结

回顾一下,本次试验主要是以面向对象的角度,设计并实现了一个简易的数据库连接池。在一定程度上对PHP代码的优化起到了作用。

另外简单的使用了simplexml对于XML文件的解析处理, 以及常用的对于文件读取的操作。

相关学习视频分享:php视频教程

以上是PHP如何用数据库连接池实现?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:CSDN。如有侵权,请联系admin@php.cn删除
酸与基本数据库:差异和何时使用。酸与基本数据库:差异和何时使用。Mar 26, 2025 pm 04:19 PM

本文比较了酸和基本数据库模型,详细介绍了它们的特征和适当的用例。酸优先确定数据完整性和一致性,适合财务和电子商务应用程序,而基础则侧重于可用性和

PHP安全文件上传:防止与文件相关的漏洞。PHP安全文件上传:防止与文件相关的漏洞。Mar 26, 2025 pm 04:18 PM

本文讨论了确保PHP文件上传的确保,以防止诸如代码注入之类的漏洞。它专注于文件类型验证,安全存储和错误处理以增强应用程序安全性。

PHP输入验证:最佳实践。PHP输入验证:最佳实践。Mar 26, 2025 pm 04:17 PM

文章讨论了PHP输入验证以增强安全性的最佳实践,重点是使用内置功能,白名单方法和服务器端验证等技术。

PHP API率限制:实施策略。PHP API率限制:实施策略。Mar 26, 2025 pm 04:16 PM

本文讨论了在PHP中实施API速率限制的策略,包括诸如令牌桶和漏水桶等算法,以及使用Symfony/Rate-limimiter之类的库。它还涵盖监视,动态调整速率限制和手

php密码哈希:password_hash和password_verify。php密码哈希:password_hash和password_verify。Mar 26, 2025 pm 04:15 PM

本文讨论了使用password_hash和pyspasswify在PHP中使用密码的好处。主要论点是,这些功能通过自动盐,强大的哈希算法和SECH来增强密码保护

OWASP前10 php:描述并减轻常见漏洞。OWASP前10 php:描述并减轻常见漏洞。Mar 26, 2025 pm 04:13 PM

本文讨论了OWASP在PHP和缓解策略中的十大漏洞。关键问题包括注射,验证损坏和XSS,并提供用于监视和保护PHP应用程序的推荐工具。

PHP XSS预防:如何预防XSS。PHP XSS预防:如何预防XSS。Mar 26, 2025 pm 04:12 PM

本文讨论了防止PHP中XSS攻击的策略,专注于输入消毒,输出编码以及使用安全增强的库和框架。

PHP接口与抽象类:何时使用。PHP接口与抽象类:何时使用。Mar 26, 2025 pm 04:11 PM

本文讨论了PHP中接口和抽象类的使用,重点是何时使用。界面定义了无实施的合同,适用于无关类和多重继承。摘要类提供常见功能

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
4 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
4 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
4 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它们
4 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

SublimeText3 英文版

SublimeText3 英文版

推荐:为Win版本,支持代码提示!

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),