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