中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在php項目中實現一個mysql連接池效果

發布時間:2021-01-30 15:18:45 來源:億速云 閱讀:448 作者:Leah 欄目:開發技術

本篇文章為大家展示了怎么在php項目中實現一個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文檔里沒有連接池的相關文檔。所以自己研究了下代碼。

首先: PHP常用的mysql擴展庫有三種 : mysql, mysqli, pdo_mysql.

* mysqli 是不支持連接池的。
* pdo_mysql 支持,但是,thinkPHP的pdo擴展不支持mysql,僅支持:'MSSQL','ORACLE','Ibase','OCI' . ( 見 Pdo.class.php 的第59行)

* mysql 支持,通過方法:mysql_pconnect . (具體參數可以看php官方文檔)

1 使ThinkPHP啟用 長連接的方式是:

class BaseMysql extends Model {
  protected $connection = array(
    'db_type' => 'mysql',
    'db_user' => '***',
    'db_pwd' => '*******',
    'db_host' => '*******',
    'db_port' => '3306',
    'db_name' => 'custom',
    'db_params' => array('persist' => true),
  );
}

如果你認為,配置這個就萬事大吉了,那就大錯特錯了。

2 mysql -> my.cnf修改配置:
[mysqld]

interactive_timeout =60 // 交互連接(mysql-client)的過期時間。
wait_timeout =30 // 長連接的過期時間時間。 這個一定要改啊!默認是8個小時。 如果請求量大點,很快連接數就占滿了。
max_connections = 100 //最大連接數,可以認為是連接池的大小

3 php.ini 修改:
[MySql]
mysql.allow_persistent = On
mysql.max_persistent = 99 // 要小于mysql配置的最大連接數
mysql.max_links = 99

4 webserver如果是apache ,需要啟用keep-alive。 否則,一旦請求退出,長連接將無法再重用。
webserver 是nginx的情況:
pm = dynamic // 默認啟動一些子進程,用于處理http請求。
pm.max_children // 最大的子進程數。 這個配置要小于 mysql 的max_connections。

5 如果發現還是不能用,請檢查操作系統的keepalive 是否啟用。

上述內容就是怎么在php項目中實現一個mysql連接池效果,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

万荣县| 芜湖市| 邢台县| 宁武县| 嘉鱼县| 长垣县| 嵊州市| 大埔县| 洪江市| 邵东县| 棋牌| 陆良县| 禹城市| 东乌珠穆沁旗| 陕西省| 榆树市| 灌阳县| 武山县| 常德市| 黄梅县| 广安市| 清徐县| 德惠市| 高碑店市| 辽阳市| 苏州市| 鸡西市| 兴山县| 安徽省| 奈曼旗| 延安市| 灵宝市| 恭城| 嵩明县| 桦川县| 延川县| 邓州市| 昌乐县| 西畴县| 南汇区| 华蓥市|