一個腳本裡面有連接mysql的sql語句,執行的時候mysql伺服器是新開一個線程(還是進程?)是處理這個連接,腳本結束後就斷開與PHP(還是apache?)的連接了嗎。那些什麼mysql長連線又是一回事呢?突然覺得啥都不懂了。 。 。
漂亮男人2017-05-16 13:08:27
1.mysql開啟進程處理對應事務
2.斷開與apache httpd進程的連接,php以apache mod方式運行,apache接受到請求,將請求轉發給mod,mod調取php
sapi執行,整個過程php以apache模組方式執行,在httpd進程中
3.短連結的缺點:建立一個連接,程式執行完畢後,就會自動斷掉與mysql的連結。於是多少次php執行,就會多少次這樣的創建和釋放過程。頻繁地創建和釋放連接,比較耗費cpu資源。
长连接就可以避免每次请求都创建连接的开销,节省了时间和IO消耗。
mysql发现一个链接长时间没有执行查询请求,就会自动断掉这个连接
大家讲道理2017-05-16 13:08:27
單從php來說不可以維持長連接,但是有方法實現的。
如果是Apache+php_module模式去跑php,透過mysql_pconnect就可以建立永久鏈接,不過這個鏈接是由Apache去維持的(mysql_pconnect在nginx+fpm下不能維持長連接的,官方文檔有說明)
nginx+fpm fpm一般設定為static,透過PDO擴展,連接資料庫時可設定長連接,由每個fpm維持一個永久連結。不過還是要根據系統去評估一下fpm進程數和資料庫最大連線數,php請求過少的話,大量連線閒置狀態浪費資源(需合理配置mysql wait_time),php請求過多,fpm進程數過多導致超過資料庫最大連接數就會造成too many connections。 。
天蓬老师2017-05-16 13:08:27
一般php每次執行sql都會建立一個短鏈接,當執行完畢後由php斷開鏈接(也許超時那麼將有MySQL來斷開鏈接)
現在有種通用的減少這種IO開銷的方式是建立資料庫連接池,維護指定數量的連接,用的時候直接獲取相關資源就可以。