首页 > 开发 > PHP > 正文

php实现mysql连接池效果实现代码

2024-05-04 22:44:04
字体:
来源:转载
供稿:网友

循环从mysql连接池中获取连接,不需要重复创建新的连接。

参考配置修改:可以参考下面的文章

防止访问量过大,把连接数占满了

<?php/** * @author xuleyan * @title mysql类 */class DbHelper{  //连接池  private $_pools = [];  //连接池大小  const POOLSIZE = 5;  const USERNAME = "root";  const PASSWORD = "root";  const HOST = "127.0.0.1";  const DB = "test";  public function __construct()    {    $db = self::DB;    $username = self::USERNAME;    $password = self::PASSWORD;    $host = self::HOST;    //持久化连接    $presistent = array(PDO::ATTR_PERSISTENT => true);    for ($i=0; $i < self::POOLSIZE; $i++) {       $connection = new PDO("mysql:dbname=$db;host=$host", $username, $password);      // sleep(3);      array_push($this->_pools, $connection);    }  }  //从数据库连接池中获取一个数据库链接资源  public function getConnection()  {    echo 'get' . count($this->_pools) . "<br>";    if (count($this->_pools) > 0) {      $one = array_pop($this->_pools);      echo 'getAfter' . count($this->_pools) . "<br>";      return $one;    } else {      throw new ErrorException ( "<mark>数据库连接池中已无链接资源,请稍后重试!</mark>" );    }  }  //将用完的数据库链接资源放回到数据库连接池  public function release($conn)  {    echo 'release' . count($this->_pools) . "<br>";    if (count($this->_pools) >= self::POOLSIZE) {      throw new ErrorException ( "<mark>数据库连接池已满!</mark>" );    } else {      array_push($this->_pools, $conn);      // $conn = null;      echo 'releaseAfter' . count($this->_pools) . "<br>";    }  }  public function query($sql)  {    try {      $conn = $this->getConnection();      $res = $conn->query($sql);      $this->release($conn);      return $res;    } catch (ErrorException $e) {      print 'error:' . $e->getMessage();      die;    }  }  public function queryAll($sql)  {    try {      $conn = $this->getConnection();      $sth = $conn->prepare($sql);      $sth->execute();      $result = $sth->fetchAll();      return $result;    } catch (PDOException $e) {      print 'error:' . $e->getMessage();      die;    }  }}

在另外的文件这样调用

<?php require_once 'db.php';$sql = 'select * from user';$dbhelper = new DbHelper;for ($i=0; $i < 10; $i++) {   $res = $dbhelper->query($sql);  // var_dump($res) . PHP_EOL;}

ThinkPHP连接MySQL的连接池使用方法

因为一个小bug,导致项目在某个晚上向mysql发送了大量的连接请求,同时mysql服务器的dns出现问题,导致反解超时。最后活活的把mysql服务器拖挂了。

最后bug修复了,并研究了一下增加 mysql连接池的办法。

这两天搜了一下,发现ThinkPHP文档里没有连接池的相关文档。所以自己研究了下代码。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表