本文主要和大家分享常駐記憶體的PHP程式mysql報錯mysql has gone away,在cli環境下,PHP程式需要長時間運行,客戶端與MySQL伺服器之間的TCP連線是不穩定的。
不穩定的原因有以下可能:
MySQL-Server會在一定時間內自動切斷連線
MySQL server has gone away的錯誤。程式處理不到就直接遇到致命錯誤並退出了。所以PHP程序中需要斷線重連。
mysql_ping的方案,每次
mysql_query進行連接偵測或定時連接檢測。
mysql_ping需要主動偵測連接,帶來了額外的消耗。定時執行
mysql_ping無法解決問題,如剛剛執行過
mysql_ping檢測之後,連接就關閉了;
mysql_query執行後檢測回傳值,如果
mysql_query回傳失敗,偵測錯誤碼發現為
2006/2013(這2個錯誤表示連接失敗),再執行一次
mysql_connect執行
mysql_connect後,重新執行
mysql_query如果
mysql_query後,重新執行
mysql_query
$res = mysql_query($sql, $this->conn);if ($res === false) { if (mysql_errno($this->conn) == 2006 or mysql_errno($this->conn) == 2013) { $r = $this->checkConnection(); if ($r === true) { continue; } }
protected function execute($query, $parameters = "") { try { ... } catch (PDOException $e) { // 服务端断开时重连一次 if ($e->errorInfo[1] == 2006 || $e->errorInfo[1] == 2013) { $this->closeConnection(); $this->connect(); ... } }
thinkphp + phpworkman 使用
TP+workman也會出現類似的情況,TP從
V5.0.6+
application/databases.php
資料庫設定檔中加入// 开启断线重连'break_reconnect' => true,
以上是PHP程式mysql報錯mysql has gone away的詳細內容。更多資訊請關注PHP中文網其他相關文章!