php封裝pdo例項以及pdo長連線的優缺點

2021-10-04 10:13:22 字數 3556 閱讀 5022

四、pdo部分demo的封裝

最近需要寫指令碼來實現崩潰日誌的入庫,不出所料又是脫離於框架的,那麼行吧,咱們只能自己封裝資料庫相關操作了。博主這裡選擇了封裝pdo運算元據庫相關。

眾所周知的,php在早期的時候是帶有mysql擴充套件的,但是後來由於過於古老缺失了mysql的新特性,因此主鍵沒落。

php5開始,更建議大家使用mysqli擴充套件,這個是mysql擴充套件的增強版,是乙個物件導向的mysql介面,更容易使用。缺點是只能操作mysql,不夠強大。

還有就是pdo擴充套件了,這個是最豐富的的乙個擴充套件,支援多種資料庫,重要的是,在安全上是比其他兩種擴充套件都要強的,通過使用prepared預處理更是有效的防止sql注入。因此,博主這裡選擇了封裝pdo相關的操作。

長連線顧名思義就是一直保持連線,相對於平時的短連線,每次請求都會重新建立鏈結來說,長連線可以有效的減少建立的過程,可以更好的節省效能。

在操作上是在連線資料庫的時候,多加乙個引數:

$pdo

=new

pdo(

$dsn

,$username

,$passwd,[

pdo:

:attr_persistent

=>

true])

;

後面的pdo::attr_persistent => true就是開啟長連線的方法。

大致結論是:長連線更多的是針對於apache的,因為apache維護乙個程序池,開啟了apache mpm功能之後,apache會預設維持乙個程序池,mysql長連線之後的連線,並沒有作為socet連線關閉,而是作為乙個不釋放的東西,放進了程序池/執行緒池裡面去。

而對於nginx來說,長連線是無效的,指令碼執行結束則釋放資源?

結論:

事實證明php-fpm是可以實現長連線的,只是如果該程序空閒的話,會造成資源浪費。

php-fpm的配置檔案可以考慮設定pm.max_requests = 1000,代表每乙個子程序的最大請求服務數量,如果超過了這個值,該子程序會被自動重啟。

比如max_requests這個引數,如果設定很大的話,那這個子程序要執行很多次才會重啟,假如這個請求發生了錯誤或者記憶體洩漏,那麼這個值設定很大是不合適的。但如果請求沒有問題,這個值設定小的話就會頻繁的重啟,這樣也會碰到不少502的問題,所以要仁者見仁,智者見智的設定了,這裡初始化設定1000,如果測試沒有記憶體洩漏等問題,可以再大一些。

總結:如果業務併發比較大且帶有事務,不建議使用長連線的方式。

博主在不斷的搜尋中,發現長連線要發揮出最佳效能始終是避不開連線池這點的,而php恰恰又不能很好的實現連線池,這點確實是有點小遺憾。

整體來說在php中是暫時無法配置和mysql的完美連線池的,在業務比較複雜的地方,還是謹慎試用長連線,每個連線都是1個執行緒,會造成大量的資源浪費。

如果是某些業務需要持續的資料庫操作,比如提交日誌介面等,那麼是可以考慮開啟長連線的,記得設定max_requests來定量關閉php-fpm連線,fpm關閉之後也會自動釋放mysql的連線。

還有pm.max_spare_servers設定伺服器空閒時最大php-fpm程序數量。

例如:pm.max_spare_servers = 25如果空閒時,會檢查程序數,多於25個了,就會關閉幾個,達到25個的狀態。

擅長swoole的同學,可以參考這篇文章:

基於swoole擴充套件實現真正的php資料庫連線池

這個網友基本的增刪改查都封裝好了,而且都有引數預處理,安全性還是可以的。不過既然作為乙個基準的類,還是缺少一些東西。

例如重連函式:

/**

* @params:重連函式,上限3次

* @date:2020/3/18

* @time:17:03

*/public

function

customconnect()

catch

(exception$e)

self:

:customconnect()

;}else

}}

這步原因是長連線會頻繁的造成mysql gone away錯誤,而這個錯誤是phpwarnings級別錯誤,try..catch根本就捕獲不到,所以博主這裡自定義錯誤處理函式來處理。

這部分是轉化phpwarnings錯誤為try..catch可以捕獲的error錯誤,關於php的報錯機制以及錯誤處理這塊,咱們下篇再討論。

//自定義warnings處理函式

set_error_handler

('customexception');

//拿到warnngs錯誤之後,轉化為error錯誤丟擲,這樣就可以被try..catch捕獲

function

customexception

($error_no

,$error_msg

,$error_file

,$error_line

)

/**

* destruct 關閉資料庫連線

*/public

function

destruct()

public

function

query

($sql

=null

,$param

=null

) *********x

}

鏈結: https:

提取碼: ebqx

最近這段時間挺頹廢的,不過疫情已經過去,春天已經到來,是時候奮鬥了少年,奧利給!

end

PDO綜合例項應用

dsn mysql host localhost dbname guestbook db new pdo dsn,root 123 連線資料庫 db query set names utf 8 affected db exec update lyb set content 用pdo修改記錄 wher...

封裝單例PDO類

單例模式封裝最終的pdo類 namespace frame vender use pdo use pdoexception 私有的靜態的儲存物件的屬性 private static instance null private db type 資料庫型別 private db host 主機名 pri...

PHP開發 PDO應用

1 pdo的介紹 pdo php資料物件 是乙個輕量級的 具有相容介面的php資料連線拓展,是乙個php官方的pecl庫,隨php 5.1發布,需要php 5的物件導向支援,因而在更早的版本上無法使用。它所提供的資料接入抽象層,具有與具體資料庫型別無關的優勢,為它所支援的資料庫提供統一的操作介面。由...