記錄一次喫力的探索過程【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連接複用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章