一直沒搞懂到底PHP有沒有Connection Pooling...
看了Persistent connections,又有人說不要用
沒事就被打個槍,還是好好研究一下
先簡單的來說有什麼做法(linux下)
另外就不用再用PDO做persistent,因為會被cache住,不會還給ODBC.
Reference
Connections and Connection management
ODBC Connection pooling
看了Persistent connections,又有人說不要用
沒事就被打個槍,還是好好研究一下
先簡單的來說有什麼做法(linux下)
- PHP的MSSQL extension
- 就是常見的pconnect,不建議
- PHP的PDO extension
- 做法
- 將connection cache下來,當其他的php script request,再重覆使用
寫法如下
<?php $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array( PDO::ATTR_PERSISTENT => true ));
實驗結果PDO可以的ATTR_PERSISTENT ,還可關掉ODBC的pooling
- 討論
- PHP官網指出,如果有ODBC做pooling的話,就用ODBC做,因為可讓同process其他的模組使用
- ODBC Connection Pooling(unixODBC)
- 做法
- 存在Web Server裡,供給Web Server Process使用
- 前提是使用的ODBC driver及library要有支援
- PDO_ODBC及unixODBC v2.0後都有支援Connection Pool
- 另外利用ODBC的還有以下,但各自有沒有再實作pooling沒研究
- Microsoft ODBC
- Easysoft ODBC
- freeTDS
- 做法:利用linux process管理connection
- 怪可怕的,如果process掛了,那connection就GG了
- 而且只接受TDS 4.2, 也不接受ntext
Summary
看起來利用ODBC比較做是比較建議的做法另外就不用再用PDO做persistent,因為會被cache住,不會還給ODBC.
- 使用Pooling注意事項
勿改變connection 狀態,例如改default db,造成使用同組db帳密的request會讀取錯誤
Reference
Connections and Connection management
ODBC Connection pooling
3 則留言:
請問一下如果使用PDO的預設選項進行mysql連線會有會有database connection pooling的功能嗎?
還是一個連線進來就要開啟一個新的db connection?
謝謝
預設沒有,你得在實體化PDO時加上 PDO::ATTR_PERSISTENT => true
如下
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
PDO::ATTR_PERSISTENT => true
));
張貼留言