在php中每個new的PDO對象,都會去鏈接mysql,都會建立一條tcp鏈接.當pdo對象賦予的變量是一個的時候,那麼他只會保持一個tcp鏈接,沒有被引用的對象鏈接會直接斷掉.若是不對這個對象進行任何操做,不傳輸任何數據,這條鏈接會在10秒後被mysql服務斷掉.php
若是使用了長鏈接參數,那麼無論循環執行幾回new PDO,只會有一個tcp鏈接mysql
關於超時現象,網上的資料大部分說受兩個參數interactive_timeout和wait_timeout影響,可是通過我測試,修改了這兩個參數,若是10秒沒有任何操做,鏈接仍然會被mysql斷掉,無論是使不使用長鏈接參數.sql
若是每隔一秒傳輸數據,那麼這條鏈接就會一直存在,狀態一直是ESTABLISHED.若是是會出現兩次執行時間較長,鏈接會被mysql斷掉
對於須要長期執行的數據庫操做腳本,比較穩妥的方式是每隔8秒左右從新new PDO對象,或者每隔循環必定次數確保在10秒內從新new PDO對象 數據庫
測試過程以下:tcp
開一個終端,不停的查看當前的鏈接狀況
while true;do clear;date;netstat -altupn|grep 3306;sleep 1;done測試
另外一個終端執行php腳本,能夠暫時把長鏈接參數去掉,能夠看到有不少tcp鏈接,狀態是time_wait,是客戶端主動關閉的.
而被mysql斷掉的鏈接是close_wait狀態,也就是被關閉一方,mysql服務裏的鏈接是FIN_WAIT2spa
<?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); }