摘自百度百科:
數據庫連接池負責分配、管理和釋放數據庫連接,它允許應用程序重復使用一個現有的數據庫連接,而不是再重新
建立一個;釋放空閑時間超過最大空閑時間的數據庫連接來避免因為沒有釋放數據庫連接而引起的數據庫連接遺
漏。這項技術能明顯提高對數據庫操作的性能。
在以前的apache或php-fpm中,數據庫是沒有連接池的,請求開始,在需要查詢數據的地方開始建立數據庫連
接,之后查詢數據,請求完成連接關閉。下一次請求繼續重復這樣的操作,弊端在於需要在每次請求中初始化數據
庫連接操作。
在Swoole中,由於對象式持久化的,那么就可以在服務器啟動初期事先建立好一定數量的數據庫連接放在那,應
用程序需要連接的時候在去獲取,這樣就省去了建立連接的過程。
查看連接數量
show processlist;
PHP代碼的編寫
<?php /** * 數據庫連接池 */ class Pool { // 可用的db對象數量 private $_avaNum = 2; // db對象的總數 private $_total = 2; // db對象的列表 private $_dbs = []; // 連接數據信息 private $_dsn = 'mysql:host=localhost;dbname=test;charset=utf8'; // 用戶名 private $_user = 'root'; // 密碼 private $_pass = 'admin888'; // 類對象 private static $_ins = null; private function __construct() { $this->_connection(); } // 連接數據庫 private function _connection() { for ($i = 0; $i < $this->_total; $i++) { $this->_dbs[] = new PDO($this->_dsn, $this->_user, $this->_pass); } } // 初始化 public static function getIns() { if (is_null(self::$_ins)) { self::$_ins = new self(); } return self::$_ins; } /** * 查詢 * @param string $sql */ public function findAll(string $sql) { if ($this->_avaNum <= 0) throw new Exception('沒有可用的連接數'); // 池中取db對象 $this->_avaNum--; $pdo = array_pop($this->_dbs); $row = $pdo->query($sql)->fetchAll(PDO::FETCH_ASSOC); // db放入池中 $this->_avaNum++; array_unshift($this->_dbs, $pdo); return $row; } } // 創建一個httpserver對象 $http = new swoole_http_server('0.0.0.0', 6060); // 設置worker進程數量 $http->set( [ # 進程數量 'worker_num' => 1, # worker進程最大的處理數量,達到將會銷毀 'max_request' => 1000, # task數量 #'task_worker_num' => 10 ] ); // worker進程啟動的時候啟動 3、效果 命令行執行腳本 瀏覽器中查看 $http->on( 'WorkerStart', function (swoole_server $server, int $worker_id) use ($obj) { $GLOBALS['obj'] = Pool::getIns(); } ); // 請求事件 $http->on( 'request', function (swoole_http_request $request, swoole_http_response $response) use ($http) { $row = $GLOBALS['obj']->findAll("select * from tt_article"); $html = json_encode($row, JSON_UNESCAPED_UNICODE); $response->header('server', 'wuchen'); $response->header('Content-Type', 'application/json;charset=utf-8'); $response->end($html); } ); // 啟動服務 $http->start();
命令行執行腳本
mysql中查看