开发者社区 问答 正文

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

I surfed on Internet for past two days to create the DB pooling by PHP, but not yet achieved. I'm using PHP and MySQLi. We bought the mysqli db with 15 Maximum user connection. I want to pool the db connection to avoid the new connection. I used

persistent

as well as

mysqli_connect

. but I don't feel much different both are creating the new connection since other user already logged in. I was trying this function to get

connection.

 <?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";
        }
    }
}
 ?>

But above function only returns the else part. Please suggest me how to handle this. Thanks in advance. For now I'm killing the process which are in sleep mode to reduce the probability of increasing DB connection.

遇到了同样的问题,在CSDN看到了,希望阿里云团队能够给出正确、标准的答案~请查看

展开
收起
西门小刚刚9630297551 2020-05-23 21:07:12 812 分享 版权
阿里云 AI 助理回答

在PHP中使用MySQLi实现数据库连接池,以提高性能并管理有限的数据库连接数,确实是一个常见的需求。尽管PHP本身并不直接支持像Java中的JDBC连接池那样的高级特性,但你可以通过一些策略来模拟连接池的效果,尤其是在你已经购买了限制最大用户连接数的MySQL实例时。

使用持久连接(Persistent Connections)

你提到已经尝试了持久连接(通过在MySQLi函数中添加p:前缀或直接使用mysqli_connect()时设置$new_link = false),这是朝着正确方向迈出的一步。持久连接意味着当脚本结束时,到MySQL服务器的连接不会被关闭,而是返回到连接池中供后续请求重用。这减少了建立新连接的开销。

确保你的代码类似于这样:

$mysqli = mysqli_connect('p:localhost', 'username', 'password', 'database');

或者

$mysqli = mysqli_connect('localhost', 'username', 'password', 'database', null, '/tmp/mysql.sock', MYSQLI_CLIENT_PERSISTENT);

检查连接是否成功

你提到的函数总是返回else部分,可能是因为连接没有成功建立,或者因为某些原因持久连接没有按预期工作。确保检查连接是否成功,并且注意错误处理:

$mysqli = mysqli_connect('p:localhost', 'username', 'password', 'database');
if ($mysqli === false) {
    die("Error: Unable to connect to MySQL." . mysqli_connect_error());
}

其他优化措施

  1. 优化代码逻辑:确保每个需要数据库操作的地方都妥善地关闭连接(对于非持久连接)。虽然对持久连接这不是必须的,良好的编程习惯仍然是重要的。

  2. 资源管理:考虑使用try-catch-finally结构(或相应的PHP结构)来确保即使在异常情况下也能释放资源。

  3. 连接超时和闲置时间:在数据库层面设置合理的连接超时和闲置时间,以避免连接被长时间占用而未被使用。

  4. 应用层连接池:如果PHP原生的持久连接不能满足需求,可以考虑使用第三方库如PDO(结合适当的配置)或像mysqli-pool这样的社区解决方案来实现更高级的连接池管理。

  5. 监控与调整:利用阿里云提供的数据库监控工具,监控数据库连接数、查询性能等指标,根据实际情况调整最大连接数设置或优化SQL语句。

  6. 负载均衡与分布式:在架构层面,考虑使用负载均衡和数据库读写分离等技术,分散数据库访问压力。

请记得,虽然这些方法可以提升效率和管理连接,但过度依赖持久连接也可能带来资源泄露的问题,特别是在高并发场景下。因此,综合考虑并适当测试是关键。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答