新聞中心
PHP如何關閉數(shù)據(jù)庫長連接?

隨著網(wǎng)絡的不斷發(fā)展,大量的并發(fā)訪問使得數(shù)據(jù)庫成為了Web應用程序架構中最重要的組成部分之一。數(shù)據(jù)庫長連接是保持數(shù)據(jù)庫連接持續(xù)不斷開,而是保持數(shù)據(jù)庫連接始終打開狀態(tài)的一種技術,它提高了應用程序的性能和響應速度。但是,在某些情況下,關閉數(shù)據(jù)庫的長連接是必須的,因為如果長時間保持連接,長時間使用數(shù)據(jù)庫資源可能對服務器造成負擔。
在本文中,我們將討論如何關閉數(shù)據(jù)庫長連接,以及如何在關閉連接時確保數(shù)據(jù)的完整性和一致性。我們將采用PHP編程語言作為我們的參考語言。
何時關閉數(shù)據(jù)庫長連接?
在關閉數(shù)據(jù)庫連接之前,我們需要了解何時應該關閉數(shù)據(jù)庫連接。關閉數(shù)據(jù)庫連接可以幫助服務器減輕負擔,但需要注意的是,如果在Web應用程序中沒有正確使用,關閉數(shù)據(jù)庫連接可能會導致應用程序的崩潰或數(shù)據(jù)損壞。以下是一些情況,應該關閉數(shù)據(jù)庫連接:
1. 當數(shù)據(jù)庫連接被占用時,應該關閉連接
在應用程序中,當某個腳本或會話占用了數(shù)據(jù)庫連接時,應該考慮關閉連接。如果長時間保持連接,在有限數(shù)量的連接池中建立新的連接可能會導致連接不足。在某些情況下,甚至可能導致服務器崩潰。
2. 當腳本執(zhí)行退出時,應該關閉連接
在PHP腳本執(zhí)行完畢后,應該關閉數(shù)據(jù)庫連接。如果不關閉連接,可能會在數(shù)據(jù)庫服務器中保留空閑連接而不釋放資源,導致服務器過載。
3. 當數(shù)據(jù)庫不再被使用時,應該關閉連接
在應用程序不再使用數(shù)據(jù)庫時,應該關閉連接。如果仍然保持連接,應用程序仍然占用連接池資源,這可能會導致其它應用程序無法獲得連接,導致性能下降。
如何關閉長連接?
在PHP中,有多種方法可以關閉長連接。以下是一些推薦的方法。
方法1:使用mysqli_close()函數(shù)
mysqli_close()函數(shù)用于關閉數(shù)據(jù)庫連接并釋放相關資源。它的參數(shù)是mysqli連接標識符,即mysqli_connect()返回的連接對象。以下是一個簡單的使用mysqli_close()函數(shù)關閉長連接的示例:
$mysqli = mysqli_connect(“l(fā)ocalhost”, “user”, “password”, “database”);
// 執(zhí)行某些數(shù)據(jù)庫操作
mysqli_close($mysqli);
在上面的示例中,我們使用mysqli_connect()函數(shù)建立數(shù)據(jù)庫連接,然后使用mysqli_close()函數(shù)關閉連接。但是,如果您沒有關閉mysqli連接,PHP會在PHP腳本退出之前為您自動關閉它。因此,在php對象自動銷毀時也會將連接關閉釋放。
方法2:使用PDO的closeCursor()函數(shù)
如果正在使用PDO對象,則可以使用PDO的closeCursor()方法關閉游標并釋放資源。這個方法不會關閉數(shù)據(jù)庫連接本身,但是它允許您釋放與查詢相關的資源,并將結果集從內(nèi)存中刪除。以下是一個可以使用closeCursor()方法關閉連接的示例:
$pdo = new PDO(“mysql:host=localhost;dbname=mydatabase”, “root”, “”);
$sth = $pdo->prepare(“SELECT * FROM mytable”);
$sth->execute();
// 處理結果
$sth->closeCursor();
$pdo->close();
在上面的示例中,我們使用PDO對象執(zhí)行一個查詢,在處理完結果后,我們使用closeCursor()方法關閉游標。
方法3:設置MySQL服務器超時
在某些情況下,如果數(shù)據(jù)庫連接超時,服務器會自動關閉它,從而釋放資源??梢栽贛ySQL服務器中設置超時以強制關閉無用的連接。以下是具有1小時MySQL服務器超時的示例:
mysql> SET GLOBAL connect_timeout=3600;
mysql> SET GLOBAL wt_timeout=3600;
將超時設置為3600秒,當連接空閑超過3600秒時,MySQL服務器將自動關閉連接,從而釋放資源,并且為新的連接提供空間。該措施只能是一個手動釋放連接的時間段,當然,如果連接斷開的情況下才會觸發(fā)失效連接被釋放。
如何在關閉連接時確保數(shù)據(jù)一致性?
在關閉數(shù)據(jù)庫連接之前,應該確保所有未完成的事務已經(jīng)完成。否則,關閉數(shù)據(jù)庫連接時未完成的事務可能會導致數(shù)據(jù)損壞。如果您使用的是帶有事務支持的數(shù)據(jù)庫(例如MySQL InnoDB),只需在執(zhí)行COMMIT或ROLLBACK事務之前關閉連接。以下是一個關閉連接之前完成事務的示例:
$mysqli = mysqli_connect(“l(fā)ocalhost”, “user”, “password”, “database”);
// 開始事務
mysqli_begin_transaction($mysqli);
// 執(zhí)行查詢
mysqli_query($mysqli, “UPDATE mytable SET value=value+1 WHERE id=1”);
// 提交事務
mysqli_commit($mysqli);
// 關閉連接
mysqli_close($mysqli);
在上面的示例中,我們使用mysqli_begin_transaction()打開了一個事務。在執(zhí)行查詢后,我們使用mysqli_commit()提交該事務。使用mysqli_close()關閉連接。
關閉數(shù)據(jù)庫連接對于Web應用程序來說很重要,因為長時間保持連接可能會對服務器造成負擔。要關閉數(shù)據(jù)庫連接,請使用mysqli_close()函數(shù)(用于mysqli連接)或PDO對象的closeCursor()方法(用于PDO連接)。在關閉連接之前,請確保所有未完成的事務已完成,以確保數(shù)據(jù)的完整性和一致性。最后要注意的是,與數(shù)據(jù)庫相關的連接,資源釋放務必要及時,否則可能對業(yè)務帶來危害。
相關問題拓展閱讀:
- 關于PHP數(shù)據(jù)庫
- 用PHP編寫的程序,當連接數(shù)據(jù)庫并打開,做完查詢等操作之后,用不用關閉在關閉數(shù)據(jù)庫?
關于PHP數(shù)據(jù)庫
PHP調(diào)用三種數(shù)據(jù)庫的方法
本文比較詳細的介紹PHP調(diào)用MySQL、ODBC以及ORACLE數(shù)據(jù)庫。
MySQL是一個小巧靈瓏的數(shù)據(jù)庫服務器軟件,對于中、小型應用系統(tǒng)是非常理想的。除了支持標準的ANSI SQL語句外,最重要的是,它還支持多種平臺,而在Unix/Linux系統(tǒng)上,MySQL支持多線程運行方式,從而能獲得相當好的性能。它和PHP、 Apache一樣,是屬于開放源代碼軟件。其官方網(wǎng)站是:
,上面提供Windows,Linux,Unix版本的源代碼的下載。
注意,MySQL訪問函數(shù)都需要有相應的權限才能運行。常用的相關函數(shù)介紹如下:
(1)integer mysql_connect(主機,用戶名,口令);
此函數(shù)開始一個對指定主機上的MySQL數(shù)據(jù)庫的連接。若該數(shù)據(jù)庫位于一個不同地端口,則在主機名后加上冒號和端口號。所有參數(shù)均為可選的,缺省情況下分別對應為本地主機、用戶正在執(zhí)行的腳本名和空。主機可以是IP地址或域名。
在腳本執(zhí)行結束時,連接被自動關閉,也可以用mysql_close提前關閉。
(2)boolean mysql_create_db(數(shù)據(jù)庫名);
創(chuàng)建一個數(shù)據(jù)庫。注意必須用一個帶有創(chuàng)建數(shù)據(jù)庫許可權的帳號打開連接。
(3)boolean mysql_select_db(數(shù)據(jù)庫名,連接號);
選擇缺省數(shù)據(jù)庫。
(4)integer mysql_query(SQL語句,連接號);
對指定數(shù)據(jù)庫進行查詢。如果SQL語句是select,則返回一個結果號,否則返回的值可以不理會。如果失敗,返回false.。
(5)array mysql_fetch_array(結果號);
取出下一行,返回一個數(shù)組.可以用數(shù)字下標訪問(之一個字段是下標 0),也可以用字符串下標訪問(即使用各字段名)。如已取了最后一行,返回 false.。
(6)mysql_fetch_row(結果號);
返回一個矩陣代表結果集中一行的所有域。每次調(diào)用都會產(chǎn)生下一行,直到?jīng)]有行剩下時返回false。每個域值都由一個從零開始的偏移量索引。這是從查詢中獲取結果的最快方法。
(7)integer mysql_num_rows(結果號);
返回結果集中行的數(shù)目
(8)integer mysql_num_fields(結果號);
返回結果集中域的數(shù)目。
(9)integer mysql_list_dbs();
向服務器查詢數(shù)據(jù)庫列表。它返回一個結果指針,該指針可用于mysql_fetch_row函數(shù)及類似函數(shù)。
(10)mysql_list_tables(數(shù)據(jù)庫名);
獲取一個指向指定數(shù)據(jù)庫的表單列表的結果指針。該結果指針可用于任何從結果集中獲取行的函數(shù)。
(11)mysql_close(連接號);
關閉對數(shù)據(jù)庫的連接。連接必須是由mysql_connect打開的。該函數(shù)的使用不是嚴格必需的,因為在腳本結束時,所有非永久鏈路都會被自動關閉。
(12)mysql_pconnect(主機,用戶名,口令);
與mysql_connect完全相似,但建立一個”永久連接”,該連接一經(jīng)建立永不關閉,即使陵陪橘使用mysql_close函數(shù)或程序執(zhí)行完畢也不亂唯關閉.下一次試圖建立永久連接時,系統(tǒng)如發(fā)現(xiàn)已存在一個永久連接尺團,則直接返回該連接號而不重新創(chuàng)建。
下面是一個調(diào)用MYSQL數(shù)據(jù)庫并分頁顯示的例子。
$pagecount) {
$pageno = $pagecount; //若pageno比總共的頁數(shù)大,則把它設置為最后一頁
}
if($pageno>0) {
$href = eregi_replace(“%2f”,”/”,urlencode($PHP_SELF));//把$PHP_SELF轉(zhuǎn)換為可以在URL上使用的字符串,這樣的話就可以處理中文目錄或中文文件名
if($pageno>1){//顯示上一頁的褳接
echo “上一頁 “;
}
else{
echo “上一頁”;
}
for($i=1;$i” . $i . ” “;
}
echo $pageno . ” “;
for($i++;$i” . $i . ” “;
}
if($pageno下一頁 “;
}
else{
echo “下一頁 “;
}
$offset = ($pageno-1) * $pagesize;//算出本頁之一條記錄在整個表中的位置(之一條記錄為0)
$sql = “select * from pagetest LIMIT $offset,$pagesize”;//生成查詢本頁數(shù)據(jù)的SQL語句
$rst = mysql_query($sql);//查詢本頁數(shù)據(jù)
$num_fields = mysql_num_fields($rst);//取得字段總數(shù)
$i = 0;
while($i”;//開始輸出表格
echo “”;
reset($fields);
while(list(,$field_name)=each($fields)){//顯示字段名稱
echo “$field_name”;
}
echo “”;
while($row=mysql_fetch_array($rst)){//顯示本頁數(shù)據(jù)
echo “”;
reset($fields);
while(list(,$field_name)=each($fields)){//顯示每個字段的值
$field_value = $row;
if($field_value==””){
echo ” “;
}
else{
echo “$field_value”;
}
}
echo “”;
}
echo “”;//表格輸出結束
mysql_free_result($rst) or die(“無法釋放result資源!”);//釋放result資源
}
else{
echo “目前該表中沒有任何數(shù)據(jù)!”;
}
mysql_close($server) or die(“無法與服務器斷開連接!”);//斷開連接并釋放資源
?>
開放數(shù)據(jù)庫連接(ODBC)已成為一種與數(shù)據(jù)庫進行通信的工業(yè)標準。PHP也提供了標準的接口,使得PHP能調(diào)用Access,SQL SERVER等數(shù)據(jù)庫。其相關函數(shù)是:
(1)integer odbc_connect(string dsn, string user, string password)
連接到一個ODBC數(shù)據(jù)庫源名字上。
(2)integer odbc_exec(integer connection, string query)或 odbc_do(integer connection, string query)
在一個連接上執(zhí)行查詢。
(3)boolean odbc_fetch_row(integer result, integer row)
從一個結果集中獲取一行數(shù)據(jù)。Row參數(shù)是可選的,若為空缺,則返回下一個有效行。在結果集中不再剩余行時返回false。
(4)boolean odbc_close(integer connection)
關閉一個數(shù)據(jù)庫的連接。若在該連接上有打開的事務,則返回一個錯誤,而且連接不會被關閉。
最后,還是看個分頁的例子:
0) {
echo “首頁”;
echo “前頁”;
};
if ($pages 后頁”;
echo “尾頁”;
};
echo “共”.$nnn.”頁”;
$query_string = “SELECT * FROM table where condition order by you wanted order”;
$cur = odbc_exec($conn_id,$query_string);
//取到循環(huán)的頂部
$cnum = ($pages-1) * $show_num;//計算當前的記錄游標的位置
//空循環(huán)到顯示記錄游標處
if ($cnum != 0){
for ($i=0;$i
Oracle(甲骨文)是世界上最為流行的關系數(shù)據(jù)庫。它是大公司推崇的工業(yè)化的強有力的引擎。我們先看看其相關的函數(shù):
(1)integer ora_logon(string user , string password)
開始對一個Oracle數(shù)據(jù)庫服務器的連接。
(2)integer ora_open(integer connection)
打開給出的連接的游標。
(3)integer ora_do(integer connection, string query)
在給出的連接上執(zhí)行查詢。PHP生成一個指示器,解析查詢,并執(zhí)行之。
(4)integer ora_parse(integer cursor, string query)
解析一個查詢并準備好執(zhí)行。
(5)boolean ora_exec(integer cursor)
執(zhí)行一個先前由ora_parse函數(shù)解析過的查詢。
(6)boolean ora_fetch(integer cursor)
此函數(shù)會使得一個執(zhí)行過的查詢中的行被取到指示器中。這使得您可以調(diào)用ora_getcolumn函數(shù)。
(7)string ora_getcolumn(integer cursor, integer column)
返回當前的值。列由零開始的數(shù)字索引。
(8)boolean ora_logoff(integer connection)
斷開對數(shù)據(jù)庫服務器的鏈接。
以下是向ORACLE數(shù)據(jù)庫插入數(shù)據(jù)的示例程序:
向ORACLE數(shù)據(jù)庫中插入數(shù)據(jù)
” method=”post”>
ID
name
Description
通過PHP你可以輕松的連接到數(shù)據(jù)庫,請求數(shù)據(jù)并將其顯示在你的web站點中,甚至修改數(shù)據(jù)庫中的數(shù)據(jù)。 MySQL是一種很流行的數(shù)據(jù)庫,并且在互聯(lián)網(wǎng)中有許多有關PHP與MySQL的教程。MySQL是免費的,這一點也許就吸引了不少人。由于其廣泛應用, 我就不想在這里贅述MySQL的使用方法了。Oracle被大量在企業(yè)應用中采用,因此我們就利用Oracle來介紹PHP與數(shù)據(jù)庫的連接。我們當然不會 提及Oracle數(shù)據(jù)庫的設計原理,原因是這已經(jīng)超出了我們的討論范圍。
PHP提供了兩套函數(shù)與Oracle連接,分別是ORA_和OCI函數(shù)。其中ORA_函數(shù)略顯陳舊。OCI函數(shù)更新?lián)f更好一些。兩者的使用語法幾乎相差無幾。如前所述,你的PHP安裝選項應該可以支持兩者的使用。
想獲得更多有關在Microsoft Windows平臺上安裝支持PHP3的Apache服務器的知識以及更多有關Oracle數(shù)據(jù)庫的知識,請查閱以下URL:
www.csoft.net/~vabu/articles/oraphp.html
。
4.1 連接
if ($conn=Ora_Logon(“user@TNSNAME”,”password”))
{
echo “SUCCESS ! Connected to database\n”;
}
else
{
echo “Failed Could not connect to database\n”;
}
Ora_Logoff($conn);
phpinfo();
?>
以上代碼使用TNSNAME(在你的tnsnames.ora文件中指明)定義的Oracle數(shù)據(jù)庫名稱、用戶名稱和密碼連接數(shù)據(jù)庫。在成功連接的基礎上,ora_logon函數(shù)返回一個非零的連接ID并儲存在變量$conn中。
4.2 查詢
假設與數(shù)據(jù)庫已經(jīng)連接就緒,下面我們就來實際的應用對數(shù)據(jù)庫的查詢。下面的代碼演示了一個連接并查詢的典型例子:
/*
* 連接數(shù)據(jù)庫并執(zhí)行查詢
*/
function printoraerr($in_cur)
{
// 檢查Oracle是否出錯
// 如果存在錯誤則顯示
// 當指針被激活時每次請求Oracle后調(diào)用該函數(shù)
if(ora_errorcode($in_cur))
echo “Oracle code – “.ora_error($in_cur).”\n”;
return;
}
/** 主程序 */
if (!($conn=ora_logon(“user@TNSNAME”,”password”)))
{
echo “Connection to database failed\n”;
exit;
}
echo “Connected as connection – $conn
\n”;
echo “Opening cursor …
\n”;
$cursor=ora_open($conn); printoraerr($cursor);
echo “Opened cursor – $cursor
\n”;
$qry=”select user,sysdate from dual”;
echo “Parsing the query $qry …
\n”;
ora_parse($cursor,$qry,0); printoraerr($cursor);
echo “Query parsed
\n”;
echo “Executing cursor …
\n”;
ora_exec($cursor); printoraerr($cursor);
echo “Executed cursor
\n”;
echo “Fetching cursor …
\n”;
while(ora_fetch($cursor))
{
$user=ora_getcolumn($cursor,0); printoraerr($cursor);
$sysdate=ora_getcolumn($cursor,1); printoraerr($cursor);
echo ” row = $user, $sysdate
\n”;
}
echo “Fetched all records
\n”;
echo “Closing cursor …
\n”;
ora_close($cursor);
echo “Closed cursor
\n”;
echo “Logging off from oracle…
\n”;
ora_logoff($conn);
echo “Logged off from oracle
\n”;
?>
(譯者注:以上代碼段缺少注釋,請讀者參考PHP Manual的Oracle數(shù)據(jù)庫函數(shù)部分)
4.3 顯示結果
以下代碼演示了怎樣查詢數(shù)據(jù)庫并將結果輸出:
function printoraerr($in_cur, $conn)
{
// 檢查Oracle是否出錯
// 如果存在錯誤則顯示
// 當指針被激活時每次請求Oracle后調(diào)用該函數(shù)
// If it encountered an error, we exit immediately
if(ora_errorcode($in_cur))
{
echo “Oracle code – “.ora_error($in_cur).”
n”;
ora_logoff($conn);
exit;
}
return;
}
function exequery($w_qry,$conn)
{
$cursor=ora_open($conn); printoraerr($cursor,$conn);
ora_parse($cursor,$w_qry,0); printoraerr($cursor,$conn);
ora_exec($cursor); printoraerr($cursor,$conn);
$numrows=0;
$w_numcols=ora_numcols($cursor);
// 顯示頭部
echo ”
\n”;
for ($i=0;$i
(譯者注:以上代碼段缺少注釋,請讀者參考PHP Manual的Oracle數(shù)據(jù)庫函數(shù)部分)
4.4 基于HTTP的Oracle登錄
將以下代碼加在PHP頁面代碼之前以確認Oracle登錄。注意你必須正確設定$ SID。
if(!isset($PHP_AUTH_USER))
{
Header(“WWW-authenticate: basic realm=\”$SID\””);
Header(“HTTP/1.0 401 Unauthorized”);
$title=”Login Instructions”;
echo “
You are not authorized to enter the site
\n”;
exit;
}
else
{
if (!($conn=ora_logon(“$PHP_AUTH_USER@$SID”,$PHP_AUTH_PW)))
{
Header(“WWW-authenticate: basic realm=\”$SID\””);
Header(“HTTP/1.0 401 Unauthorized”);
$title=”Login Instructions”;
echo “
You are not authorised to enter the site
\n”;
exit;
}
}
用PHP編寫的程序,當連接數(shù)據(jù)庫并打開,做完查詢等操作之后,用不用關閉在關閉數(shù)據(jù)庫?
不會浪費CPU資源
但是更好自己關閉雀塵conn
你在后臺可以看到很多conn都是超時了才自動斷開
當然搏歲如果你用現(xiàn)成的一些數(shù)據(jù)庫操作類比如DB,PDO,可以基歲睜不關閉
調(diào)用析構函數(shù)的時候會自動關閉
php關閉數(shù)據(jù)庫長連接的介紹就聊到這里吧,感謝你花時間閱讀本站內(nèi)容,更多關于php關閉數(shù)據(jù)庫長連接,「PHP如何關閉數(shù)據(jù)庫長連接?」,關于PHP數(shù)據(jù)庫,用PHP編寫的程序,當連接數(shù)據(jù)庫并打開,做完查詢等操作之后,用不用關閉在關閉數(shù)據(jù)庫?的信息別忘了在本站進行查找喔。
創(chuàng)新互聯(lián)網(wǎng)絡推廣網(wǎng)站建設,網(wǎng)站設計,網(wǎng)站建設公司,網(wǎng)站制作,網(wǎng)頁設計,1500元定制網(wǎng)站優(yōu)化全包,先排名后付費,已為上千家服務,聯(lián)系電話:13518219792
網(wǎng)站題目:「PHP如何關閉數(shù)據(jù)庫長連接?」(php關閉數(shù)據(jù)庫長連接)
標題URL:http://www.5511xx.com/article/dpjhidi.html


咨詢
建站咨詢
