TP5 0斷線重連時記憶體溢位問題

2021-10-23 07:12:33 字數 1182 閱讀 5279

在用多程序處理對賬單時,我發現了乙個問題,在子程序關閉後,主程序再次連線資料庫時會報mysql server has gone away錯誤,這是由於在建立子程序時,linux會在父程序的基礎上直接拷貝乙個子程序,所以這裡也會複製出乙份資料庫連線的socket的檔案描述符,父程序和子程序中的socket檔案描述符都指向核心中的同乙個socket檔案(ps:這個地方參考趣說網路協議第十三講:套接字socket中的內容會更加明白一點),所以當子程序關閉時,也直接把這個socket連線給關閉,導致主程序失去了資料庫連線。

所以在這個地方我使用了tp5的斷線重連機制,當執行sql時如果檢查到資料庫返回的是mysql server has gone away,將重新建立乙個資料庫鏈結。然後問題出現了,當往資料庫進行寫操作時,這裡陷入了死迴圈,達到設定的記憶體上線然後被kill掉。

然後我去看了一下原始碼,在connection.php檔案的447,抓取到了資料庫的異常,然後判斷是丟失了連線,所以呼叫了close方法並再次執行了execute:

} catch (\pdoexception $e) 

throw new pdoexception($e, $this->config, $this->getlastsql());

}

然而在close方法中,並沒有釋放查詢結果:

/**

* 關閉資料庫(或者重新連線)

* @access public

* @return $this

*/public function close()

導致在419行,這裡$this->pdostatement->querystring和$sql是相等,從而也不會去釋放上一次的pdostatemen,從而一直使用這個已經失去了連線的pdostatemen去執行寫操作,導致陷入了死迴圈:

//釋放前次的查詢結果

if (!empty($this->pdostatement) && $this->pdostatement->querystring != $sql)

/**

* 關閉資料庫(或者重新連線)

* @access public

* @return $this

*/public function close()

tp5 0增刪改查

模型層裡 usertell this where tellphone data tellphone find return usertell 獲取所有會員 public function getallmem 列表分頁 public function getpagedata pagesize 單查 p...

tp5 0的學習筆記

extend 擴充套件類庫目錄 可定義 public 對外訪問目錄 runtime 執行時目錄 可定義 vendor 第三方類庫目錄 composer thinkphp 框架核心目錄 build.php 自動生成定義檔案 參考 composer.json composer定義檔案 license.t...

websocket 斷線重連

摘要websocket reconnect websocket是html5發布之後出現的一種新技術,說它是新技術,其實也不是多新的技術了,因為畢竟也有2 3年了,但是找了很多國內的例項,缺發現不多,不知道是它不好用呢,還是說這種技術原來就有缺陷呢,咱們暫且不說,今天我們就來介紹一下websocket...