mysql 串連到底是什嗎?

來源:互聯網
上載者:User
$db = new PDO()
在底層,產生的DB執行個體,到底是什嗎?

在linux下一切皆檔案理念下,我想,這個執行個體應該也是一個檔案。
1、那這個檔案儲存著哪些資訊?

假設這樣一個情境:

$db = new PDO(...)while(true){sleep(90000)    $db->xx()}

DB串連長時間不活動,mysql會自動斷開,在斷開後,這時PHP去請求會報 MySQL server has gone away的錯誤。

2、如何在$db->xx()前判斷這個DB已經斷開了?

回複內容:

$db = new PDO()
在底層,產生的DB執行個體,到底是什嗎?

在linux下一切皆檔案理念下,我想,這個執行個體應該也是一個檔案。
1、那這個檔案儲存著哪些資訊?

假設這樣一個情境:

$db = new PDO(...)while(true){sleep(90000)    $db->xx()}

DB串連長時間不活動,mysql會自動斷開,在斷開後,這時PHP去請求會報 MySQL server has gone away的錯誤。

2、如何在$db->xx()前判斷這個DB已經斷開了?

  1. 那這個檔案儲存著哪些資訊?
    我也沒找到那個檔案,執行個體對象都在記憶體吧

  2. 如何在$db->xx()前判斷這個DB已經斷開了?
    可以使用異常拋出:

query('SELECT * from FOO') as $row) {        print_r($row);    }    $dbh = null;} catch (PDOException $e) {    print "Error!: " . $e->getMessage() . "
"; die();}?>

PHP提供持久化串連
持久串連緩衝可以避免每次指令碼需要與資料庫回話時建立一個新串連的開銷,從而讓 web 應用程式更快。

 true));?>

RESOURCE

mysql 導致這個行為的地方有兩個 interactive_timeout 、wait_timeout
可以通過修改mysql設定檔/etc/my.cnf來延長時間。這裡設定的是10秒
[mysqld]

wait_timeout=10interactive_timeout=10

解決方案是:
將這兩個參數改為:

wait_timeout=100interactive_timeout=100

重啟MySQL Server進入後,查看設定已經生效。
你試一試

本質上,對mysql的連結就是一個普通到socket通訊端,所以也是一個File Descriptor。既然是tcp連結,那麼連結雙方有權利在任何時刻取消連結,就像樓上大神所說,這一般由mysql伺服器定義連結逾時時間,這樣做是為了防止過多的連結導致mysql資源佔用。

一般來說在php中並不需要sleep啥的,正常對pdo對象的使用並不用考慮連結逾時,pdo會維護好一切。

if($db){ $db->xx() }

一切歸文檔,參閱官方文檔,一般便知

本質是一塊記憶體緩衝區

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.