簡體   English   中英

除了ping之外,保持mysql連接存活的更好方法

[英]Better way to keep mysql connection alive other than pinging

我確信很多開發人員都遇到了可怕的“ Mysql走開”問題,尤其是在處理長時間運行的腳本(例如為后台或cron作業保留的腳本)時。 這是由於mysql和php之間的連接被刪除引起的。 防止這種情況發生的最佳方法到底是什么?

我目前在這里直接使用帶有setActive方法的自定義CDbConnection類:

http://www.yiiframework.com/forum/index.php/topic/20063-general-error-2006-mysql-server-has-gone-away/page__p__254495#entry254495

這很好用,並且阻止了我的MySQL消失問題。 不幸的是,我一直遇到一個隨機的問題,即在通過CActiveRecord將新記錄插入數據庫后,yii無法正確設置主鍵值。 您最終得到的pk值為0。我更深入地研究了該問題,最終能夠在我的本地計算機上重現該問題。 似乎我的自定義CDbConnection :: setActive()方法可能是罪魁禍首。 當您運行CActiveRecord :: save()方法時,yii准備必要的sql並通過PDO執行它。 此后,yii立即使用PDO :: lastInsertId()獲取最新插入的ID,並填充模型PK屬性。 但是,如果由於某種原因,初始插入命令需要花費幾秒鍾以上的時間才能完成? 這將觸發我的自定義setActive()方法中的mysql ping操作,該方法僅等待當前時間戳和最后一個活動時間戳之間的2秒差異。 我注意到,當您執行PDO插入查詢,然后執行PDO選擇查詢,最后執行PDO :: lastInsertId()時,最后插入的ID值為0。

我不能確定這是否是發生在隨機出現問題的實時服務器上的情況,但這是我能夠重現此問題的唯一方法。

實際上, Server Has Gone Away原因有很多,在MySQL文檔中Server Has Gone Away對此進行了充分說明。 幾個常見的技巧可以嘗試:

  • 增加my.cnf文件中的wait_timeout 如果您的鎖需要保持較長時間,請參見innodb_lock_wait_timeoutlock_wait_timeout

    服務器在關閉非交互式連接之前等待活動的秒數。

  • 增加my.cnf文件中的max_allowed_pa​​cket 大型數據包可能會使連接斷開,並導致其突然關閉。

    如果使用大的BLOB列或長字符串,則必須增加此值。 它應該與要使用的最大BLOB一樣大。 max_allowed_pa​​cket的協議限制為1GB。 該值應為1024的倍數; 非整數將四舍五入到最接近的倍數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM