PHP 與 Oracle 的組合長期面臨「連線風暴」難題:PHP 無真多線程、非持久連線 (oci_connect) 每請求建立/銷毀連線,CPU 飆高、擴展性差;持久連線 (oci_pconnect) 雖復用但佔用大量記憶體、進程間隔離無法共享。Oracle 11g 引入 DRCP (Database Resident Connection Pool),將連線池下沉到資料庫端,徹底改寫遊戲規則。
:POOLED (Easy Connect) 或 (SERVER=POOLED) (TNS),邏輯碼零修改。-- 啟動池 (預設名 SYS_DEFAULT_CONNECTION_POOL)
EXEC DBMS_CONNECTION_POOL.START_POOL();
-- 參數調優
EXEC DBMS_CONNECTION_POOL.CONFIGURE_POOL(
pool_name => 'SYS_DEFAULT_CONNECTION_POOL',
minsize => 10, -- 最小 Server Process
maxsize => 200, -- 最大 Server Process
incrsize => 5, -- 擴容步長
session_cached_cursors => 50, -- Session 級 Cursor Cache
inactivity_timeout => 300, -- 閒置超時秒數
max_think_time => 600, -- 最大思考時間
max_use_session => 500000, -- 進程最大服務 Session 數
max_lifetime_session => 86400 -- 進程最大壽命秒數
);
// Easy Connect
$conn = oci_pconnect('scott', 'tiger', 'localhost:1521/orcl:POOLED');
// 或 TNSNAMES.ORA 配置
// ORCL_POOLED = (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))
// (CONNECT_DATA=(SERVICE_NAME=orcl)(SERVER=POOLED)))
$conn = oci_pconnect('scott', 'tiger', 'ORCL_POOLED');
關鍵: 必須用 oci_pconnect (持久連線),配合 DRCP 實現「客戶端持久連線 → 資料庫端共享 Server Process」雙層復用。
官方測試:4 CPU Xeon 2.8GHz、2GB RAM、32-bit RHEL 4,支撐 14,000 並發連線,CPU 65%。實測通常打 5-7 折,但仍可支撐 5,000-10,000 並發,遠超傳統模式 (DEDICATED 通常 <500 連線即瓶頸)。
適用場景: 高併發 Web (PHP/Python/Node.js)、連線生命週期短、邏輯輕量、用戶數固定 (連線池按用戶隔離)。
oci_pconnect 獲取的 Session 可能不同,跨請求事務不可行 (PHP 無狀態本就不應跨請求事務)。V$CPOOL_STATS、V$CPOOL_CC_STATS 觀察池命中率、等待隊列、進程數。| 模式 | 連線建立開銷 | 記憶體佔用 | 跨進程共享 | 最大並發 |
|---|---|---|---|---|
| oci_connect (Dedicated) | 極高 (每請求) | 低 (即用即釋) | 否 | < 500 |
| oci_pconnect (Dedicated) | 低 (進程內復用) | 高 (進程獨占) | 否 (進程隔離) | < 1,000 |
| oci_pconnect + DRCP | 極低 (池中取用) | 可控 (池共享) | 是 (跨進程/節點) | 5,000-14,000+ |
DRCP 是 Oracle 為無狀態高併發語言 (PHP、Python、Ruby、Node.js) 量身打造的殺手鐧。將連線池從應用層下沉到資料庫層,打破進程邊界,以極低記憶體成本支撐萬級並發。若你正在用 PHP/Oracle 且面臨連線瓶頸,立即評估 DRCP,收益立竿見影。