一個腳本里面有連接mysql的sql語句,執(zhí)行的時候mysql服務器是新開一個線程(還是進程?)是處理這個連接,腳本結(jié)束后就斷開與PHP(還是apache?)的連接了嗎。那些什么mysql長連接又是回事呢?突然覺得啥都不懂了。。。
認證高級PHP講師
要手動關(guān)閉 框架的話類里面的析構(gòu)函數(shù)寫上關(guān)閉的代碼 一般都封裝好了 不操心 一般都是單例模式連接mysql
1.mysql開啟進程處理相應事務
2.斷開與apache httpd進程的連接,php以apache mod方式運行,apache接受到請求,將請求轉(zhuǎn)發(fā)給mod,mod調(diào)取php
sapi執(zhí)行,整個過程php以apache模塊方式執(zhí)行,在httpd進程中
3.短鏈接的缺點:創(chuàng)建一個連接,程序執(zhí)行完畢后,就會自動斷掉與mysql的鏈接。于是多少次php執(zhí)行,就會多少次這樣的創(chuàng)建和釋放過程。頻繁地創(chuàng)建和釋放連接,比較耗費cpu資源。
長連接就可以避免每次請求都創(chuàng)建連接的開銷,節(jié)省了時間和IO消耗。
mysql發(fā)現(xiàn)一個鏈接長時間沒有執(zhí)行查詢請求,就會自動斷掉這個連接
單從php來說不可以維持長連接,但是有方法實現(xiàn)的。
如果是Apache+php_module模式去跑php,通過mysql_pconnect就可以建立永久鏈接,不過這個鏈接是由Apache去維持的(mysql_pconnect在nginx+fpm下不能維持長連接的,官方文檔有說明)
nginx+fpm fpm一般設置為static,通過PDO擴展,連接數(shù)據(jù)庫時可設置長連接,由每個fpm維持一個永久鏈接。不過還是要根據(jù)系統(tǒng)去評估一下fpm進程數(shù)和數(shù)據(jù)庫最大連接數(shù),php請求過少的話,大量連接閑置狀態(tài)浪費資源(需合理配置mysql wait_time),php請求過多,fpm進程數(shù)過多導致超過數(shù)據(jù)庫最大連接數(shù)就會造成too many connections。。
一般php每次執(zhí)行sql都會建立一個短鏈接,當執(zhí)行完畢后由php斷開鏈接(也許超時那么將有MySQL來斷開鏈接)
現(xiàn)在有種通用的減少這種IO開銷的方式是建立數(shù)據(jù)庫連接池,維護指定數(shù)量的連接,用的時候直接獲取相關(guān)資源就可以。