pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

php實(shí)現(xiàn)mysql連接池效果實(shí)現(xiàn)代碼

這篇文章主要介紹了php代碼實(shí)現(xiàn)mysql連接池效果,需要的朋友可以參考下

循環(huán)從mysql連接池中獲取連接,不需要重復(fù)創(chuàng)建新的連接。

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

防止訪問(wèn)量過(guò)大,把連接數(shù)占滿了


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

  //從數(shù)據(jù)庫(kù)連接池中獲取一個(gè)數(shù)據(jù)庫(kù)鏈接資源
  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>數(shù)據(jù)庫(kù)連接池中已無(wú)鏈接資源,請(qǐng)稍后重試!</mark>" );
    }
  }

  //將用完的數(shù)據(jù)庫(kù)鏈接資源放回到數(shù)據(jù)庫(kù)連接池
  public function release($conn)
  {
    echo 'release' . count($this->_pools) . "<br>";
    if (count($this->_pools) >= self::POOLSIZE) {
      throw new ErrorException ( "<mark>數(shù)據(jù)庫(kù)連接池已滿!</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;
    }
  }
}

在另外的文件這樣調(diào)用


<?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的連接池使用方法

因?yàn)橐粋€(gè)小bug,導(dǎo)致項(xiàng)目在某個(gè)晚上向mysql發(fā)送了大量的連接請(qǐng)求,同時(shí)mysql服務(wù)器的dns出現(xiàn)問(wèn)題,導(dǎo)致反解超時(shí)。最后活活的把mysql服務(wù)器拖掛了。

最后bug修復(fù)了,并研究了一下增加 mysql連接池的辦法。

這兩天搜了一下,發(fā)現(xiàn)ThinkPHP文檔里沒(méi)有連接池的相關(guān)文檔。所以自己研究了下代碼。

首先: PHP常用的mysql擴(kuò)展庫(kù)有三種 : mysql, mysqli, pdo_mysql.

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

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

1 使ThinkPHP啟用 長(zhǎng)連接的方式是:


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),
  );
}

如果你認(rèn)為,配置這個(gè)就萬(wàn)事大吉了,那就大錯(cuò)特錯(cuò)了。

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

interactive_timeout =60 // 交互連接(mysql-client)的過(guò)期時(shí)間。
wait_timeout =30 // 長(zhǎng)連接的過(guò)期時(shí)間時(shí)間。 這個(gè)一定要改??!默認(rèn)是8個(gè)小時(shí)。 如果請(qǐng)求量大點(diǎn),很快連接數(shù)就占滿了。
max_connections = 100 //最大連接數(shù),可以認(rèn)為是連接池的大小

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

4 webserver如果是apache ,需要啟用keep-alive。 否則,一旦請(qǐng)求退出,長(zhǎng)連接將無(wú)法再重用。
webserver 是nginx的情況:
pm = dynamic // 默認(rèn)啟動(dòng)一些子進(jìn)程,用于處理http請(qǐng)求。
pm.max_children // 最大的子進(jìn)程數(shù)。 這個(gè)配置要小于 mysql 的max_connections。

5 如果發(fā)現(xiàn)還是不能用,請(qǐng)檢查操作系統(tǒng)的keepalive 是否啟用。

綜述:

需要 keep-alive 和 數(shù)據(jù)庫(kù)長(zhǎng)連接同時(shí)啟用,否則長(zhǎng)連接回白白的占用mysql的連接數(shù)資源,而無(wú)法重用。
對(duì)于 nginx + php-fpm 的情況,其實(shí)是保持了 php-fpm 子進(jìn)程與mysql的長(zhǎng)連接。 前端的http請(qǐng)求被分配給哪個(gè) php-fpm子進(jìn)程,該子進(jìn)程就重用自己與mysql 的長(zhǎng)連接。

上述是一整天的研究結(jié)果,不完備的地方,請(qǐng)大家指出,在此先行謝過(guò)!

【網(wǎng)站聲明】本站部分內(nèi)容來(lái)源于互聯(lián)網(wǎng),旨在幫助大家更快的解決問(wèn)題,如果有圖片或者內(nèi)容侵犯了您的權(quán)益,請(qǐng)聯(lián)系我們刪除處理,感謝您的支持!

相關(guān)文檔推薦

主站蜘蛛池模板: 挨踢网-大家的导航!| 电动不锈钢套筒阀-球面偏置气动钟阀-三通换向阀止回阀-永嘉鸿宇阀门有限公司 | 缠绕机|缠绕膜包装机|缠绕包装机-上海晏陵智能设备有限公司 | 带式过滤机厂家_价格_型号规格参数-江西核威环保科技有限公司 | 量子管通环-自清洗过滤器-全自动反冲洗过滤器-北京罗伦过滤技术集团有限公司 | 微妙网,专业的动画师、特效师、CG模型设计师网站! - wmiao.com 超声波电磁流量计-液位计-孔板流量计-料位计-江苏信仪自动化仪表有限公司 | 517瓜水果特产网|一个专注特产好物的网站 | 造价工程师网,考试时间查询,报名入口信息-网站首页 | 工业废水处理|污水处理厂|废水治理设备工程技术公司-苏州瑞美迪 今日娱乐圈——影视剧集_八卦娱乐_明星八卦_最新娱乐八卦新闻 | 皮带式输送机械|链板式输送机|不锈钢输送机|网带输送机械设备——青岛鸿儒机械有限公司 | 九爱图纸|机械CAD图纸下载交流中心 | IIS7站长之家-站长工具-爱网站请使用IIS7站长综合查询工具,中国站长【WWW.IIS7.COM】 | 船用烟火信号弹-CCS防汛救生圈-船用救生抛绳器(海威救生设备) | 上海璟文空运首页_一级航空货运代理公司_机场快递当日达 | 小威小说网 - 新小威小说网 - 小威小说网小说搜索引擎 | 青岛美佳乐清洁工程有限公司|青岛油烟管道清洗|酒店|企事业单位|学校工厂厨房|青岛油烟管道清洗 插针变压器-家用电器变压器-工业空调变压器-CD型电抗器-余姚市中驰电器有限公司 | 济南轻型钢结构/济南铁艺护栏/济南铁艺大门-济南燕翔铁艺制品有限公司 | 福州甲醛检测-福建室内空气检测_环境检测_水质检测-福建中凯检测技术有限公司 | 黑龙江京科脑康医院-哈尔滨精神病医院哪家好_哈尔滨精神科医院排名_黑龙江精神心理病专科医院 | 聚天冬氨酸,亚氨基二琥珀酸四钠,PASP,IDS - 远联化工 | PO膜_灌浆膜及地膜供应厂家 - 青州市鲁谊塑料厂 | 医院专用门厂家报价-医用病房门尺寸大全-抗菌木门品牌推荐 | 威实软件_软件定制开发_OA_OA办公系统_OA系统_办公自动化软件 | 成都热收缩包装机_袖口式膜包机_高速塑封机价格_全自动封切机器_大型套膜机厂家 | 附着力促进剂-尼龙处理剂-PP处理剂-金属附着力处理剂-东莞市炅盛塑胶科技有限公司 | 升降炉_真空气氛炉_管式电阻炉厂家-山东中辰电炉有限公司 | 企业管理培训,企业培训公开课,企业内训课程,企业培训师 - 名课堂企业管理培训网 | 深圳法律咨询【24小时在线】深圳律师咨询免费 | 冷轧机|两肋冷轧机|扁钢冷轧机|倒立式拉丝机|钢筋拔丝机|收线机-巩义市华瑞重工机械制造有限公司 | 合肥升降机-合肥升降货梯-安徽升降平台「厂家直销」-安徽鼎升自动化科技有限公司 | 西安耀程造价培训机构_工程预算实训_广联达实作实操培训 | 湖州织里童装_女童男童中大童装_款式多尺码全_织里儿童网【官网】-嘉兴嘉乐网络科技有限公司 | 电位器_轻触开关_USB连接器_广东精密龙电子科技有限公司 | 绿萝净除甲醛|深圳除甲醛公司|测甲醛怎么收费|培训机构|电影院|办公室|车内|室内除甲醛案例|原理|方法|价格立马咨询 | 致胜管家软件服务【在线免费体验】 | 铸钢件厂家-铸钢齿轮-减速机厂家-淄博凯振机械有限公司 | 网站建设-高端品牌网站设计制作一站式定制_杭州APP/微信小程序开发运营-鼎易科技 | 超细粉碎机|超微气流磨|气流分级机|粉体改性设备|超微粉碎设备-山东埃尔派粉碎机厂家 | 淘趣英语网 - 在线英语学习,零基础英语学习网站 | 净化工程_无尘车间_无尘车间装修-广州科凌净化工程有限公司 | 碳纤维复合材料制品生产定制工厂订制厂家-凯夫拉凯芙拉碳纤维手机壳套-碳纤维雪茄盒外壳套-深圳市润大世纪新材料科技有限公司 |