PHP Mysqli 数据库连接池以避免最大用户数

PHP Mysqli database connection pooling to avoid maximum user count

我这两天在网上冲浪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";
        }
    }
}
 ?>

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

这不是它的工作原理。参见 here。当你执行 new mysqli('p:... 连接时,MySQLi 会 select 一个可用连接,而不是 PHP 对象。

function getConnection(){
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    return (new mysqli('p:xxxx','yyy','zzz','aaaa'));
}

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 的文章。