欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PHP建立MySQL與MySQLi持久化連接(長連接)區(qū)別

 更新時間:2025年02月22日 14:44:13   作者:caihuayuan4  
MySQL是一種流行的關系型數(shù)據(jù)庫,而PHP為其提供了兩種不同的API,即MySQL和MySQLi,在使用這兩個API時,我們可以選擇使用持久連接或非持久連接,MySQL的持久連接需使用`mysql_pconnect`,而MySQLi持久連接默認啟用,使用持久連接時應注意服務器連接限制和資源占用問題

在PHP開發(fā)中,與數(shù)據(jù)庫的交互是非常常見的操作。MySQL是一種流行的關系型數(shù)據(jù)庫,而PHP為其提供了兩種不同的API,即MySQL和MySQLi。在使用這兩個API時,我們可以選擇使用持久連接或非持久連接。MySQL的持久連接需使用`mysql_pconnect`,而MySQLi持久連接默認啟用。盡管MySQLi有性能和安全優(yōu)勢,但使用持久連接時應注意服務器連接限制和資源占用問題。

php-mysql的持久連接只在同一個進程里可“復用”,不同進程之間玩不了。fpm的子進程可以常駐,所以只要子進程還在,那么上一次請求創(chuàng)建的持久連接,下一次請求還可以復用。cli每次都新起一個進程,沒法把連接復用,那么短連接和持久連接其實是一樣的。

如果在 PHP 5.3 的版本以前想要創(chuàng)建MySQL的持久化連接(長連接),需要顯式調(diào)用 pconnect 創(chuàng)建:

$con = mysql_pconnect($server['host'], $server['username'], $server['password']);
if (!($con === false)) {
if (mysql_select_db($server['database'], $con) === false) {
    echo('Could not select database: ' . mysql_error());
    continue;
}
// do something here……
}

從 PHP 5.3 開始, mysqli 擴展開始支持持久化連接,持久化連接已經(jīng)在 PDO MYSQL 和 ext/mysql 中提供支持。

持久化連接的優(yōu)勢

持久化連接的目的在于重用客戶端到服務器之間的連接, 而不是每次在需要的時候都重新建立一個連接。
由于持久化連接可以將已經(jīng)建立的連接緩存起來,以備后續(xù)的使用, 所以省去了建立新的連接的開銷, 因此可以帶來性能上的提升

不像 mysql 擴展,mysqli 沒有提供一個特殊的方法用于打開持久化連接。 如果 mysqli 打開一個持久化連接,需要在創(chuàng)建連接時,在host前面增加p:兩個字符。

mysql 和 mysqli 擴展的區(qū)別如下:

持久鏈接建立方式,mysqli是在host前面增加“p:”兩個字符;mysql使用mysql_pconnect函數(shù);
mysqli 建立的持久鏈接,必須在mysqli_close之后,才能被下一個請求復用;mysql的長連接,可以立即被復用;
pdo 建立的持久鏈接,不必關閉,就能復用;
mysqli 建立持久鏈接時,會自動清理上一個會話變量、回滾事務、解鎖表、釋放鎖等操作;而 mysql 擴展則不會(這點非常重要);
mysqli 判斷是否為同一持久鏈接標識是 IP,PORT、USER、PASS、DBNAME、SOCKET;mysql 是 IP、PORT、USER、PASS、CLIENT_FLAGS;

持久化長連接的風險

使用持久化連接也會存在一些風險, 因為在緩存中的連接可能處于一種不可預測的狀態(tài)。
例如,如果客戶端未能正常關閉連接, 可能在這個連接上殘留了對庫表的鎖, 那么當這個連接被其他請求重用的時候,這個連接還是處于 有鎖的狀態(tài)。
所以,如果要很好的使用持久化連接,那么要求代碼在和數(shù)據(jù)庫進行交互的時候, 確保做好清理工作,保證被緩存的連接是一個干凈的,沒有殘留的狀態(tài)。

mysqli 擴展的持久化連接提供了內(nèi)建的清理處理代碼。 mysqli 所做的清理工作包括:

回滾處于活動狀態(tài)的事務
關閉并且刪除臨時表
對表解鎖
重置會話變量
關閉預編譯 SQL 語句(在PHP中經(jīng)常發(fā)生)
關閉處理程序
釋放通過 GET_LOCK() 獲得的鎖

這確保了將連接返回到連接池的時候, 它處于一種“干凈”的狀態(tài),可以被其他客戶端進程所使用。

mysqli 擴展 通過自動調(diào)用 C-API 函數(shù) mysql_change_user() 來完成這個清理工作。

自動清理的特性有優(yōu)點也有缺點:
優(yōu)點是程序員不再需要擔心附加的清理代碼, 因為它們會自動調(diào)用。
然而缺點就是 性能 可能會 慢一點, 因為每次從連接池返回一個連接都需要執(zhí)行這些清理代碼。

這個自動清理的代碼可以通過在編譯 php 時定義
MYSQLI_NO_CHANGE_USER_ON_PCONNECT 來關閉。

注意: mysqli 擴展在使用 MySQL Native Driver 或 Mysql Client Library(libmysql)時都支持持久化連接。

為什么我的長連接不生效?

村長多說兩句,相信很多小伙伴遇到過這個問題:

明明創(chuàng)建了 pconnect,show process_list 查看數(shù)據(jù)庫鏈接,卻發(fā)現(xiàn)長連接沒有被復用,而是重新創(chuàng)建了一個,這是為啥呢?這得從PHP的運作模式說起。

一般 php 有2種運行模式, 一是作為 cgi 運行, 二是作為 apache 的模塊運行:

作為 cgi 的時候 connect 跟 pconnect 沒什么不同, 因為每次 cgi 進行運行結(jié)束后都會被銷毀清理掉資源;
php 作為 apache 模塊方式運行時, 可以使用到數(shù)據(jù)庫持續(xù)連接, 但可能會存在潛在的問題;

說白了,如果你是 cgi 運行方式,pconnection 永遠也不會生效。

長連接最大的缺點就是萬一一個用戶鎖死,當前進程就永久鎖死了;假如你在apache里的設置是進程永不銷毀的話就…
總之,盡量使用 mysql_connect,因為運行結(jié)束后會自動斷開;再說了現(xiàn)在的機器性能都不差,不至于缺少那點兒創(chuàng)建銷毀帶來的內(nèi)存開銷。

到此這篇關于PHP建立MySQL與MySQLi持久化連接(長連接)區(qū)別的文章就介紹到這了,更多相關php連接MySQL與MySQLi的長連接區(qū)別內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:

相關文章

最新評論