1. 程式人生 > >記錄一次吃力的探索過程【Thinkphp搭建Mysql長連線並重用】

記錄一次吃力的探索過程【Thinkphp搭建Mysql長連線並重用】

使用Thinkphp搭建伺服器後,進行ab測試發現併發效能幾乎為0。-c引數設定為1和2,8,每秒完成請求都只有0.9左右。

於是開啟mysql全域性日誌一看,我的乖乖,一個http請求就connect資料庫一次close一次,什麼session儲存,mysql長連線,不存在的。

當時不知道thinkphp的G方法可以用來除錯,找不到Thinkphp底層用於建立資料庫連線的函式,於是走了彎路。

彎路一:嘗試在QT客戶端內部實現一個小容器,儲存session,同時讓php伺服器接受引數並判斷,如果是同一個tcp請求,則重用該資料庫連線。直到後來發現static引數的宣告並沒有什麼用處,每次請求都是重新宣告。

伺服器端程式碼思路如下:

if(serverPID==clientParam){ }

else{new static connect}//建立靜態變數

彎路二:嘗試使用mysqlpconnect函式,直接另起爐灶,無奈複雜度太大,TP框架還就挺好用的(累覺不愛),陣列讀取不需要造輪子處理返回值。於是重新開始。

彎路三:嘗試使用tcp連線,放棄http協議(我終於發現php為什麼做不了高效能伺服器了)

彎路四:嘗試通過apache管理mysql長連線(這時,我恍然間發現php只是作為apache的小弟在執行,apache每次請求都拿出對應的執行緒)

在重複了更多的彎路後,我在查詢XDebug的使用方法時,順路查詢了Thinkphp的G方法,於是靠著G方法測執行時間,找到了TP框架底層建立資料庫連線的函式 new PDO(thinkphp/library/think/db/Driver.class.php 行108),把param引數換成允許持久化。

參考了幾篇設定php mysql長連線的部落格,設定了php mysql apache的配置檔案引數,最終實現了mysql連線複用。