在php中每一個new的PDO物件,都會去連接mysql,都會創建一條tcp連接.當pdo物件賦予的變數是一個的時候,那么他只會保持一個tcp連接,沒有被參考的物件連接會直接斷掉.如果不對這個物件進行任何操作,不傳輸任何資料,這條連接會在10秒后被mysql服務斷掉.
如果使用了長連接引數,那么不管回圈執行幾次new PDO,只會有一個tcp連接
關于超時現象,網上的資料大部分說受兩個引數interactive_timeout和wait_timeout影響,但是經過我測驗,修改了這兩個引數,如果10秒沒有任何操作,連接仍然會被mysql斷掉,不管是使不使用長連接引數.
如果每隔一秒傳輸資料,那么這條連接就會一直存在,狀態一直是ESTABLISHED.如果是會出現兩次執行時間較長,連接會被mysql斷掉
對于需要長期執行的資料庫操作腳本,比較穩妥的方式是每隔8秒左右重新new PDO物件,或者每隔回圈一定次數確保在10秒內重新new PDO物件
測驗程序如下:
開一個終端,不停的查看當前的連接情況
while true;do clear;date;netstat -altupn|grep 3306;sleep 1;done
另一個終端執行php腳本,可以暫時把長連接引數去掉,可以看到有很多tcp連接,狀態是time_wait,是客戶端主動關閉的.
而被mysql斷掉的連接是close_wait狀態,也就是被關閉一方,mysql服務里的連接是FIN_WAIT2

<?php //$option=array(PDO::ATTR_PERSISTENT => true); for($i=0;$i<10;$i++){ $pdo=new PDO("mysql:host=127.0.0.1;dbname=my_test","root","xxx",$option); var_dump($pdo); } while(1){ sleep(5); $pdo->query("set names utf8"); sleep(11); }
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/119142.html
標籤:PHP
上一篇:C#遍歷datagridview,只要是帶關鍵字的行就將后邊的數值加起來
下一篇:求助用c語言撰寫下面的ti
