<kbd id='woaibaidu'></kbd><address id='woaibaidu'><style id='woaibaidu'></style></address><button id='woaibaidu'></button>

          当前位置:主页 > 网络编程 > PHP编程 >
            php实现mysql连接池效果实现代码
            2018-01-29 22:03 发布 次浏览

          循环从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);
              }
            }
          
            //从数据库衔接池中获得1个数据库链接资源
            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的衔接池运用办法

          由于1个小bug,招致项目在某个早晨向mysql发送了少量的衔接恳求,同时mysql效劳器的dns呈现成绩,招致反解超时。最初活活的把mysql效劳器拖挂了。

          最初bug修复了,并研讨了1下添加 mysql衔接池的方法。

          这两天搜了1下,发现ThinkPHP文档里没有衔接池的相干文档。所以本人研讨了下代码。

          首先: PHP经常使用的mysql扩大库有3种 : 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 // 长衔接的过时工夫工夫。 这个1定要改啊!默许是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。 否则,1旦恳求加入,长衔接将没法再重用。
          webserver 是nginx的状况:
          pm = dynamic // 默许启动1些子历程,用于处置http恳求。
          pm.max_children // 最大的子历程数。 这个设置要小于 mysql 的max_connections。

          5 假如发现照旧不能用,请反省操作零碎的keepalive 能否启用。

          综述:

          需求 keep-alive 和 数据库长衔接同时启用,否则长衔接回白白的占用mysql的衔接数资源,而没法重用。
          关于 nginx + php-fpm 的状况,实际上是坚持了 php-fpm 子历程与mysql的长衔接。 前真个http恳求被分配给哪一个 php-fpm子历程,该子历程就重用本人与mysql 的长衔接。

          上述是1整天的研讨后果,不齐备的中央,请各人指出,在此先行谢过!