使用mysql的長鏈接php
有個資料看得我雲裏霧裏的。如今用本身的言語來總結一下,寫文字,可以加深本身的理解。也會在寫的過程當中幫助本身發現理解方面瑕疵,繼續查資料求證。java
短連接的缺點:建立一個鏈接,程序執行完畢後,就會自動斷掉與mysqlserver的連接。因而多少次php執行,就會多少次這樣的建立和釋放過程。頻繁地建立和釋放鏈接,比較耗費cpu資源。mysql
長鏈接就能夠避免每次請求都建立鏈接的開銷,節省了時間和IO消耗。sql
長鏈接是提升了性能。不過還有一些細節的問題須要解決,即mysql發現一個連接長時間沒有執行查詢請求,就會自動斷掉這個鏈接。數據庫
具體多長時間後斷掉,有個timeout設置時間。經過sql:"show global variables like '%timeout';" 查看。服務器
my.conf中的函數
wait_timeout=2880000sqlserver
interactive_timeout = 2880000性能
當連接已經失效了,仍然去執行查詢操做,一個明顯的表現形式就是提示:MySQL server has gone awaythis
啓發:MySQL server has gone away這個信息是mysql服務器提示出來的呢?仍是php的mysql擴展提示出來的呢?
據判斷,確定是應用程序服務器報出來的(php)。想想,若是mysql都已經接到請求了,那麼還出現什麼連接不上。明明都已經連接上了。
既然mysql服務器都可以接受請求,那麼還怎麼處理不過來呢。
咱們去百度搜索:MySQL server has gone away。歷來沒有看到java連接mysql出現這樣的狀況。若是是mysql 服務器報出來的。那麼應該與應用程序無關。因此應該也會搜索到相關信息的。
據此判斷,這是php拋出來的信息。php連接不上mysql了。
http://ronaldbradford.com/blog/sqlstatehy000-general-error-2006-mysql-server-has-gone-away-2013-01-02/
使用mysql_ping()函數可以檢測與mysql服務器是否是連接狀態。避免出現MySQL server has gone away。
每次執行查詢前,先使用mysql_ping()去檢測一下鏈接有沒有斷掉。若是斷掉了。從新創建一次連接。
具體代碼爲:
if(mysql_ping()!=0){
//連接已經斷開,須要從新創建連接
$this->conn = mysql_connect($ip,$user_name,$password);
}
小缺點是:每次都要去檢測執行mysql_ping(),耗費資源。
一種改進辦法是:根據mysql_query()的返回錯誤碼來決定是否是要從新連接
$res = mysql_query($sql, $this->conn);
if($res===false){
if(mysql_errno($this->conn)==2006 || mysql_errno($this->conn)==2003){
//去檢測一下與mysql服務器的連接是否是有效
if(mysql_ping()!=0){
//從新創建連接
}
}
}
備註:
2003對應的錯誤信息是,Can't connect to MySQL
2006 對應的錯誤信息是 MySQL server has gone away
思考:真正意義上本身實現的鏈接池,是長期與數據庫服務器連接起連接的。如何創建起連接呢。就是按期發送心跳包。經過心跳包與服務器進行通訊。
若是沒有發送心跳包,則會被數據庫服務器斷掉這個連接。由於長時間沒有通訊的連接,要斷掉。
待完善
MYSQL has gone away的解釋:
http://database.51cto.com/art/201105/261107.htm