要提升php連接mysql性能,關(guān)鍵在于連接復(fù)用。具體做法包括:1. 使用持久化連接(如pdo或mysqli設(shè)置attr_persistent為true),適用于請求量大的web應(yīng)用;2. 合理管理連接生命周期,避免頻繁創(chuàng)建和銷毀連接,建議使用單例或封裝db類;3. 控制最大連接數(shù)和超時設(shè)置,調(diào)整mysql的max_connections及php的連接超時參數(shù);4. 使用連接池(如swoole協(xié)程、proxysql等),適合高并發(fā)場景。以上方法優(yōu)先級依次降低,中小型項目做好前兩項即可滿足需求。
在PHP連接MySQL時,想要提升性能,連接復(fù)用是一個非常關(guān)鍵的優(yōu)化點。直接頻繁地建立和關(guān)閉數(shù)據(jù)庫連接會帶來不小的開銷,尤其是在高并發(fā)場景下。要解決這個問題,核心思路是:減少重復(fù)連接、合理利用已有連接資源。
下面從幾個實用角度出發(fā),講講具體怎么處理。
使用持久化連接(Persistent Connection)
PHP支持通過PDO或mysqli使用持久化連接,它的原理是:當腳本執(zhí)行結(jié)束時,并不會真正斷開與MySQL的連接,而是將連接放回“連接池”中,供后續(xù)請求復(fù)用。
立即學(xué)習(xí)“PHP免費學(xué)習(xí)筆記(深入)”;
適用場景:
- 請求量較大的Web應(yīng)用
- 數(shù)據(jù)庫操作頻率高但每次操作時間短
注意事項:
- 持久化連接不能跨請求共享事務(wù)或臨時表
- 不同的請求之間如果使用了相同的DSN、用戶名和密碼,才可能復(fù)用連接
- 不建議在CLI模式下使用,容易造成連接堆積
示例配置(PDO):
$dsn = 'mysql:host=localhost;dbname=test'; $user = 'root'; $pass = ''; $opt = [ PDO::ATTR_PERSISTENT => true ]; $pdo = new PDO($dsn, $user, $pass, $opt);
合理管理連接生命周期
不要在每個小函數(shù)里都new一個數(shù)據(jù)庫連接,這樣不僅浪費資源,還容易出錯。正確的做法是:
建議做法:
- 使用依賴注入方式傳入連接實例
- 在框架中使用服務(wù)容器統(tǒng)一管理連接
- 如果不用框架,也可以封裝一個簡單的DB類來控制連接獲取和釋放
控制最大連接數(shù)和超時設(shè)置
MySQL服務(wù)器有最大連接數(shù)限制,默認值通常較小(比如151),而PHP默認是允許同時打開多個連接的。如果不加以控制,很容易出現(xiàn)連接爆滿的問題。
優(yōu)化建議:
- 修改MySQL的max_connections參數(shù),根據(jù)實際需求調(diào)整
- 設(shè)置合理的連接超時時間,避免長時間空閑連接占用資源
- PHP端可以設(shè)置mysql.connect_timeout、default_socket_timeout等參數(shù)
可參考的php.ini設(shè)置:
mysql.connect_timeout = 5 default_socket_timeout = 30
使用連接池(進階方案)
對于大型項目或微服務(wù)架構(gòu)來說,連接池是一個更高級但也更有效的解決方案。它不是PHP原生支持的功能,但可以通過一些中間件或擴展實現(xiàn)。
常見方案包括:
- 使用swoole協(xié)程 + 連接池
- 使用ProxySQL、MaxScale等代理層做連接池
- 使用數(shù)據(jù)庫中間件如PGBouncer(雖然主要是postgresql用的)
這類方案更適合高并發(fā)、長連接場景,能顯著降低連接壓力。
以上這些方法,有些是基礎(chǔ)但必須做的,有些是進階可選的。在大多數(shù)中小型項目中,優(yōu)先做好持久化連接和連接生命周期管理,就能解決大部分問題。至于連接池,屬于更高階的優(yōu)化手段,視情況而定。
基本上就這些,不復(fù)雜但容易忽略。