以前用swoole的時候,沒有涉及到數據庫連接,碰到問題沒有那么多,后來公司業務原生來寫swoole多進程,問題出現很多
1.多進程之間會產生進程隔離,global無效,不能共用一個mysql,redis連接,所以每個進程單獨開一個數據庫連接
2mysql數據庫是多線程,每一個線程處理一個連接,當一個query連接超過mysql的max_timeout時,公司設置為20s,會回收,所以在swoole中,由於是一個長駐內存的服務,我們建立了一個mysql的連接,不主動關閉 或者是用pconnect的方式,那么這個mysql連接會一直保存着,然后長時間沒有和數據庫有交互,就主動被mysql server關閉了,之后繼續用這個連接,就報mysql server gone away了
解決方法:
1修改mysql連接時間,但是設置太大的話,數據庫產生大量sleep線程
2增加斷線重連的操作
3減少僵屍進程出現