swoole項目思維轉換 -- mysql server gone away

來源:互聯網
上載者:User

標籤:

mysql做為php的黃金搭檔和互連網上應用最廣泛的資料庫,免不了天天與之打交道,不少朋友在熟悉swoole的使用之後,也趟平了不少坑,準備實戰了,終於上線了,正愉快的體驗swoole帶來的巨大改進,突然資料庫操作bug了,大量報mysql server gone away, 於是swooler心裡千萬之草尼馬奔騰而過,大罵,swoole誤我~~~

且慢!!!這真不是swoole的問題!!!!不是swoole的問題!!!!不是swoole的問題!!!!(重要的事情說三遍)


原因

    不是swoole的問題,那他的原因是什麼呢?

    這要從mysql的機制說起,mysql本身是一個多線程的程式,每個串連過來,會開一個線程去處理相關的query, 所以mysql為了避免佔著毛坑不拉屎,會定期回收長時間沒有任何query的串連(時間周期受wait_timeout配置影響),所以在swoole中,由於是一個長駐記憶體的服務,我們建立了一個mysql的串連,不主動關閉 或者是用pconnect的方式,那麼這個mysql串連會一直儲存著,然後長時間沒有和資料庫有互動,就主動被mysql server關閉了,之後繼續用這個串連,就報mysql server gone away了。


解決方案

    知道問題產生的原因,就可以對症下藥了。

    方案1:  修改mysql的wait_timeout值為一個非常大的值。

                 此方法不太可取,可能會產生大量的sleep串連,導致mysql串連上限了, 建議不使用。

    方案2:每次query之前主動進行串連檢測

                 如果是用mysqli,可用內建的mysqli_ping

                 樣本:

      if (!$mysqli->ping()) {  

         mysqli->connect(); //重連

    }

                 如果是pdo,可以檢測mysql server的伺服器資訊來判斷:

            try {

                    $pdo->getAttribute(\PDO::ATTR_SERVER_INFO);

                } catch (\Exception $e) {

                    if ($e->getCode() == ‘HY000‘) {

                        $pdo = new PDO(xxx);  //重連

                    } else {

                        throw $e;

                    }

                }


但這個方案有個缺點:額外多一次請求,所以改進方法:  用一個全域變數存放最後一次query的時間,下一次query的時候先和現在時間對比一下,超過waite_timeout再重連. 或者也可以用swoole_tick定時檢測。

          方案3:被動檢測, 每次query用try catch包起來,如有mysql gone away異常,則重新串連,再執行一次當前sql.
                    樣本:

               try {

                    query($sql);

                } catch (\Exception $e) {

                    if ($e->getCode() == ‘HY000‘) {

                        reconnect(); //重連

                        query($sql)

 

                    } else {

                        throw $e;

                    }

                }


        方案4: 用短串連,務必每次操作完之後,手動close

額外問題:mysql為什麼需要串連池?


swoole項目思維轉換 -- mysql server gone away

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.