mysql_pconnect():腳本結束時不關閉連接
Apache 主進程
└─ 子進程 1 → MySQL 連接 A (永久)
└─ 子進程 2 → MySQL 連接 B (永久)
└─ 子進程 N → MySQL 連接 N (永久)
請求到達 → 主進程分發給空閒子進程
子進程複用 → 直接使用已建立的 MySQL 連接
子進程結束/回收 → 連接隨進程歸還進程池,不釋放
| 配置 | 值 |
|---|---|
| Apache MaxClients | 1000 |
| MySQL max_connections | 100 |
PHP 手冊明確指出:僅適合低併發網站。但低併發下永久連接帶來的性能提升微乎其微。
結論: mysql_pconnect 在現代高併發架構中屬於「雞肋」角色,不推薦使用。
| 方案 | 原理 | 優點 | 缺點 | 推薦度 |
|---|---|---|---|---|
| 短連接 + 連接池 | 應用層/中間件管理池 | 連接復用、可控、跨語言 | 需額外組件 | ★★★★★ |
| MySQL 內建連接池 (8.0+) | 服務端管理 | 零代碼改動、透明 | 版本要求高 | ★★★★☆ |
| ProxySQL | 中間代理層池化 | 強大、可監控、分片支持 | 運維複雜度高 | ★★★★☆ |
| PHP-FPM + mysqli 持久連接 | PHP 進程級復用 | 原生、無額外依賴 | 進程數=連接數,擴展性受限 | ★★★☆☆ |
| PDO::ATTR_PERSISTENT | PDO 層面持久化 | 代碼遷移簡單 | 同 mysql_pconnect 缺陷 | ★★☆☆☆ |
| SQL Relay | 專用連接池守護進程 | 成熟、多數據庫支持 | 部署複雜、項目較老 | ★★★☆☆ |
| Apache mod_dbd | APR 數據庫驅動框架 | Apache 原生集成 | 僅限 Apache、配置繁瑣 | ★★☆☆☆ |
mysqli_connect() / new PDO(),配合數據庫端連接池pm.max_children ≤ MySQL max_connections,避免連接數超限Threads_connected、Aborted_connects、連接等待時間mysql_pconnect 替換為 mysqli_connect / PDOmax_connections ≥ 應用最大併發進程數wait_timeout、interactive_timeout