從【MySQL server has gone away】說起

來源:互聯網
上載者:User

標籤:

本文目的

這幾天開發了一個PHP CLI程式,用於後台定時調度執行一些任務。此指令碼採用了PHP的多進程(pcntl_fork),共用記憶體和訊號量進行IPC和同步。目的是將串列的任 務並存執行,縮短執行時間。可是在工作子進程中,訪問myql時一直報錯,通過mysql_error返回的資訊卻是冷冷的一句話“MySQL server has gone away”。簡單說一句自己掛掉了就完事,太不負責任了。經過仔細搜尋,終於發現問題的原因,在此做個分享,也作為備忘。

什麼導致“MySQL server has gone away”

據官方文檔描述,主要有以下一些原因導致此異常出現(我粗略的翻譯一下,以原文為準):

1. mysqld線程被殺死.

2. 使用了關閉的連結資源

3. 無許可權

4. TCP/IP逾時

5. mysql伺服器端逾時

6. windows相容問題

7. sql過長

8. 請求包過長

9. DNS解析問題

10. 多進程並發使用同一個連結

11. mysql的未知bug

吐槽:以上情況雖然列舉得很詳細,但是為什麼不能在第一時間通過mysql_error返回呢?

問題的原因

由於我的使用情境是在多進程環境下,所以很快將問題鎖定在了mysql連結資源上,果然很快找到答案:mysql_connect函數的第四個參數$new_link沒有設定為true.

首先看看mysql_connect函數簽名:

resource mysql_connect ([ string $server = ini_get("mysql.default_host") [, string $username = ini_get("mysql.default_user") [, string $password = ini_get("mysql.default_password") [, bool $new_link = false [, int $client_flags = 0 ]]]]] )

預設情況,$new_link設定為false,也就是會重用現有的連結資源(如果有)。設想一下,如果多個進程同時調用 mysql_connect,並且沒有設定$new_link為true,那麼這些進程就會同時使用同一個連結資源,也就是上面第10個原因,導致 mysql報告“mysql server has gone away”的異常。

所以,將$new_link設定為true後,此問題就解決了。

問題的本質

mysql連結資源,底層其實是封裝了socket和相關的資料,如果多個進程用一個連結,也就是同一個socket和伺服器互動,結果可想而知,伺服器被混淆了,所以只能吐出一句冷冷的“MySQL server has gone away”了事。

但是,我還有一個疑問,php在apache環境下訪問mysql時,並沒有顯示設定$new_link為True,但是從沒有出現上述這個現象,難道是apache處理並發時,採用的單進程而不是多進程?

總結

初次涉及多進程相關開發,往往遇到許多莫名奇妙的問題,有些現象時有時無。這時候,一定冷靜分析問題的現象,不要隨意將責任推究給其他系統(比如linux,mysql等),而是要在自己的程式上找原因。

在剛遇到此問題時,由於一時沒有找到問題的原因,我還懷疑過是mysql的效能太低,不能承受我的程式的並發。其實這是一種出於本能的自我安慰。 mysql的並發效能在業績是有口皆碑的,怎麼會在我的幾個進程面前倒下。經過一番網上搜素和思考,終於找到問題原因,現在可以鬆一口氣了。

值得高興的是,程式改成並發後,效能有了質的飛躍,執行時間縮小到原來的十分之一,系統使用率高達90%多,改進前不到10%。

從【MySQL server has 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.