有個資料看得我雲裡霧裡的。現在用自己的言語來總結一下,寫文字,能夠加深自己的理解。也會在寫的過程中幫助自己發現理解方面瑕疵,繼續查資料求證。
長連線就可以避免每次請求都建立連線的開銷,節省了時間和io消耗。
長連線是提高了效能。不過還有一些細節的問題需要解決,即mysql發現乙個鏈結長時間沒有執行查詢請求,就會自動斷掉這個連線。
具體多長時間後斷掉,有個timeout設定時間。通過sql:"show global variables like 『%timeout『;" 檢視。
my.conf中的
wait_timeout=2880000
interactive_timeout = 2880000
啟發:mysql server has gone away這個資訊是mysql伺服器提示出來的呢?還是php的mysql擴充套件提示出來的呢?
據判斷,肯定是應用程式伺服器報出來的(php)。想一想,如果mysql都已經接到請求了,那麼還出現什麼鏈結不上。明明都已經鏈結上了。
既然mysql伺服器都能夠接受請求,那麼還怎麼處理不過來呢。
據此判斷,這是php丟擲來的資訊。php鏈結不上mysql了。
使用mysql_ping()函式能夠檢測與mysql伺服器是不是鏈結狀態。避免出現mysql server has gone away。
每次執行查詢前,先使用mysql_ping()去檢測一下連線有沒有斷掉。如果斷掉了。重新建立一次鏈結。
具體**為:
if(mysql_ping()!=0){
//鏈結已經斷開,需要重新建立鏈結
$this->conn = mysql_connect($ip,$user_name,$password);
小缺點是:每次都要去檢測執行mysql_ping(),耗費資源。
$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的解釋:
原文:
長連線(輪詢,心跳,socket)
概念 表示客戶端和伺服器端保持聯絡,客戶端向伺服器端一直獲取資料,或者是伺服器端一直向客戶端推送資料。基本的長連線方式 輪詢表示客服端利用定時器原理 setinterval 間隔時間內向伺服器請求最新資料。心跳原理跟輪詢類似,但是心跳在一段時間內沒有向到伺服器請求,就會認為客戶端狀態異常。socke...
長連線 心跳保活機制
而在實現長連線方式時,存在很多效能問題,如 長連線保活 今天,我將 手把手教大家實現自適應的心跳保活機制,從而能高效維持長連線 確保實時性 避免短時間內重複連線所造成的通道資源 網路資源的浪費 可是,長連線會存在斷開的情況,而 斷開原因 主要是 長連線所在程序被殺死 nat超時 網路狀態發生變化 其...
長連線 短連線 心跳的簡單總結
通常瀏覽器訪問伺服器的時候就是短鏈結 連線 資料傳輸 關閉連線 1.client與server通過三次握手建立連線,client傳送請求訊息,server返回響應 2.雙方都可以發起close操作,不過一般都是client先發起close操作 3.短鏈結一般只會在client server之間傳遞一...