php實作mysql連線池的效果
這篇文章主要介紹了php程式碼實現mysql連接池效果,需要的朋友可以參考下
循環從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 是否啟用。
綜述:
需要 keep-alive 和 資料庫長連線同時啟用,否則長連接回白白的佔用mysql的連線數資源,而無法重複使用。
對於 nginx php-fpm 的情況,其實是保持了 php-fpm 子程序與mysql的長連結。前端的http請求被指派給哪個 php-fpm子程序,該子程序就重複使用自己與mysql 的長連線。
上述是一整天的研究結果,不完備的地方,請大家指出,在此先行謝過!
以上就是這篇文章的全部內容了,感謝大家的閱讀,更多相關內容請關注PHP中文網!
相關建議:
以上是php實作mysql連線池的效果的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Laravel 是一款 PHP 框架,用於輕鬆構建 Web 應用程序。它提供一系列強大的功能,包括:安裝: 使用 Composer 全局安裝 Laravel CLI,並在項目目錄中創建應用程序。路由: 在 routes/web.php 中定義 URL 和處理函數之間的關係。視圖: 在 resources/views 中創建視圖以呈現應用程序的界面。數據庫集成: 提供與 MySQL 等數據庫的開箱即用集成,並使用遷移來創建和修改表。模型和控制器: 模型表示數據庫實體,控制器處理 HTTP 請求。

MySQL和phpMyAdmin是強大的數據庫管理工具。 1)MySQL用於創建數據庫和表、執行DML和SQL查詢。 2)phpMyAdmin提供直觀界面進行數據庫管理、表結構管理、數據操作和用戶權限管理。

MySQL与其他编程语言相比,主要用于存储和管理数据,而其他语言如Python、Java、C 则用于逻辑处理和应用开发。MySQL以其高性能、可扩展性和跨平台支持著称,适合数据管理需求,而其他语言在各自领域如数据分析、企业应用和系统编程中各有优势。

在開發一個小型應用時,我遇到了一個棘手的問題:需要快速集成一個輕量級的數據庫操作庫。嘗試了多個庫後,我發現它們要么功能過多,要么兼容性不佳。最終,我找到了minii/db,這是一個基於Yii2的簡化版本,完美地解決了我的問題。

文章摘要:本文提供了詳細分步說明,指導讀者如何輕鬆安裝 Laravel 框架。 Laravel 是一個功能強大的 PHP 框架,它 упростил 和加快了 web 應用程序的開發過程。本教程涵蓋了從系統要求到配置數據庫和設置路由等各個方面的安裝過程。通過遵循這些步驟,讀者可以快速高效地為他們的 Laravel 項目打下堅實的基礎。

在使用Thelia開發電商網站時,我遇到了一個棘手的問題:MySQL模式設置不當,導致某些功能無法正常運行。經過一番探索,我找到了一個名為TheliaMySQLModesChecker的模塊,它能夠自動修復Thelia所需的MySQL模式,徹底解決了我的困擾。

MySQL通過表結構和SQL查詢高效管理結構化數據,並通過外鍵實現表間關係。 1.創建表時定義數據格式和類型。 2.使用外鍵建立表間關係。 3.通過索引和查詢優化提高性能。 4.定期備份和監控數據庫確保數據安全和性能優化。

MySQL是一個開源的關係型數據庫管理系統,廣泛應用於Web開發。它的關鍵特性包括:1.支持多種存儲引擎,如InnoDB和MyISAM,適用於不同場景;2.提供主從復制功能,利於負載均衡和數據備份;3.通過查詢優化和索引使用提高查詢效率。
