show global variables like '%timeout%'; 可見MySQL的wait_timeout和interactive_timeout的預設值都是28800秒(8小時).PHP-FPM跟MySQL的持久連線,空閒時間超過wait_timeout後,頁面再次執行mysql_pconnect會回傳"MySQL server has gone away"的Warning訊息,這時會重新建立持久連線,並不會影響程式的正常運作,這時可以用@抑制Warning訊息的輸出.但編寫運作在命令列下的PHP CLI程式時,建議不要使用持久連接,建議每次使用時都重新開啟和關閉資料庫連線,避免資料庫連線遺失時導致CLI程式故障的問題.
假設你用5個PHP-FPM工作行程跑PHP Web服務.
mysql_connect是短連線,也就是在PHP-FPM工作進程處理完成目前請求後,會自動釋放到MySQL的資料庫連線.
mysql_pconnect是持久連接,也就是每個PHP-FPM跟MySQL建立連接後,在處理完成當前請求後,並不會釋放數據庫連接,下一個請求能重用這個數據庫連接,從而避免不同請求重複建立資料庫連線帶來的開銷.
有5個PHP-FPM工作進程,就能保持5個到MySQL的持久連接,形成了一一對應的"數據庫連接池",但要注意PHP-FPM的進程數
pm.max_children
不要多於MySQL的最大連線數max_connections
(預設151).show global variables like '%timeout%';
可見MySQL的wait_timeout
和interactive_timeout
的預設值都是28800秒(8小時).PHP-FPM跟MySQL的持久連線,空閒時間超過wait_timeout
後,頁面再次執行mysql_pconnect會回傳"MySQL server has gone away"的Warning訊息,這時會重新建立持久連線,並不會影響程式的正常運作,這時可以用@抑制Warning訊息的輸出.但編寫運作在命令列下的PHP CLI程式時,建議不要使用持久連接,建議每次使用時都重新開啟和關閉資料庫連線,避免資料庫連線遺失時導致CLI程式故障的問題.提一下,mysql_系列函數在PHP7中已經不再支援,建議改用mysqli和pdo_mysql來操作MySQL資料庫,mysqli和pdo_mysql同樣支援建立持久連線.