首页 > 解决方案 > PHP Mysqli 数据库连接池以避免最大用户数

问题描述

我在网上冲浪了两天,通过 PHP 创建数据库池,但还没有实现。我正在使用 PHP 和 MySQLi。我们购买了最大用户连接数为 15 的 mysqli 数据库。我想汇集数据库连接以避免新连接。我也persistent用过mysqli_connect。但由于其他用户已经登录,我觉得两者都在创建新连接并没有太大的不同。我正在尝试使用此功能来获取DB连接。

 <?php
function getConnection(){
    if ($connect){
        return $connect;
    }else{
        $connect = new mysqli('p:xxxx','yyy','zzz','aaaa');
        return $connect;
        if(mysqli_connect_errno($connect))
        {
            echo "Server Busy";
        }
    }
}
 ?>

但上面的函数只返回 else 部分。请建议我如何处理这个问题。提前致谢。现在我正在杀死处于睡眠模式的进程,以减少增加数据库连接的可能性。

标签: phpmysqliconnection-pooling

解决方案


PHP 中没有连接池。

您尝试使用的持久连接(那个“p:”位)是达到最大连接数的最可靠方法,因此请立即摆脱它。

15 个并发连接实际上是很多。只需优化您的查询,因此一个典型的连接将持续 0.1 秒,这意味着 150 个并发执行的 PHP 脚本相当于 1500 个在线用户。

此外,您需要添加

static $connect;

作为函数的第一行,或者每次调用时都会创建新连接,这就是您收到此错误的实际原因。

<?php
function getConnection(){
    static $connect;

    if (!$connect){
        mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
        $connect = new mysqli('xxxx','yyy','zzz','aaaa');
        $connect->set_charset('utf8mb4');
    }
    return $connect;
}

更好的是,完全摆脱这个函数,拥有一个包含 mysql 连接代码的单独文件,然后$connect在代码周围使用该变量。有关详细信息,请参阅我关于mysqli connect的文章。


推荐阅读