$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已經斷開了?
那這個檔案儲存著哪些資訊?
我也沒找到那個檔案,執行個體對象都在記憶體吧
如何在$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() }
一切歸文檔,參閱官方文檔,一般便知
本質是一塊記憶體緩衝區