php - 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 部分。请建议我如何处理这个问题。提前致谢。现在我正在杀死处于睡眠模式的进程,以减少增加数据库连接的可能性。
解决方案
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的文章。
推荐阅读
- web-scraping - 使用 python 请求抓取数据表
- android - 如何在 DialogFragment 中访问 EditText 数据
- list - 删除 Elixir 中列表元素的所有条目(不仅仅是第一个)
- c# - Razor 引擎库在 azure 函数上引发错误
- apache-spark - 使用函数在迭代器上触发并行化
- java - 如何从新框架中调用上一个框架,如何再次设置可见?
- javascript - 如何在 ThreeJS 中旋转 gltf 模型
- bluetooth - 每个相同的型号都有相同的服务 uuid?
- pandas - 熊猫:使用 python 保存 Dict/Json
- timezone - .ics TZID 和偏移量不起作用