在mysql中我們會看到有兩種常用的數據庫連接模式,一種是長久連接,另一各是頁面訪問完之后就斷了連接,下面我來分別介紹mysql_connect與mysql_pconnect的區別,有需要了解的朋友可參考.
PHP mysql_pconnect
mysql_pconnect() 函數打開一個到 MySQL 服務器的持久連接.
mysql_pconnect() 和 mysql_connect() 非常相似,但有兩個主要區別.
1.當連接的時候本函數將先嘗試尋找一個在同一個主機上用同樣的用戶名和密碼已經打開的(持久)連接,如果找到,則返回此連接標識而不打開新連接。
2.其次,當腳本執行完畢后到 SQL 服務器的連接不會被關閉,此連接將保持打開以備以后使用(mysql_close() 不會關閉由 mysql_pconnect() 建立的連接)。
語法:mysql_pconnect(server,user,pwd,clientflag)
參數 描述
server 可選。規定要連接的服務器。
可以包括端口號,例如 "hostname:port",或者到本地套接字的路徑,例如對于 localhost 的 ":/path/to/socket".
如果 PHP 指令 mysql.default_host 未定義(默認情況),則默認值是 'localhost:3306'.
user 可選,用戶名,默認值是服務器進程所有者的用戶名.
pwd 可選,密碼,默認值是空密碼.
clientflag 可選,client_flags 參數可以是以下常量的組合:
•MYSQL_CLIENT_SSL - 使用 SSL 加密
•MYSQL_CLIENT_COMPRESS - 使用壓縮協議
•MYSQL_CLIENT_IGNORE_SPACE - 允許函數名后的間隔
•MYSQL_CLIENT_INTERACTIVE - 允許關閉連接之前的交互超時非活動時間
返回值,如果成功,則返回一個 MySQL 持久連接標識符,出錯則返回 FALSE.
提示和注釋
注釋:可選參數 clientflag 自 PHP 4.3.0 版起可用.
提示:要創建一個非持久連接,請使用 mysql_connect() 函數.
例子,代碼如下:
- <?php
- $con = mysql_pconnect("localhost","mysql_user","mysql_pwd");
- if (!$con)
- {
- die('Could not connect: ' . mysql_error());
- }
- ?>
PHP mysql_connect
mysql_connect() 函數打開非持久的 MySQL 連接.
語法:mysql_connect(server,user,pwd,newlink,clientflag)
參數 描述
server 可選,規定要連接的服務器.
可以包括端口號,例如 "hostname:port",或者到本地套接字的路徑,例如對于 localhost 的 ":/path/to/socket"。
如果 PHP 指令 mysql.default_host 未定義(默認情況),則默認值是 'localhost:3306'.
user 可選,用戶名,默認值是服務器進程所有者的用戶名.
pwd 可選,密碼,默認值是空密碼.
newlink 可選,如果用同樣的參數第二次調用 mysql_connect(),將不會建立新連接,而將返回已經打開的連接標識,參數 new_link 改變此行為并使 mysql_connect() 總是打開新的連接,甚至當 mysql_connect() 曾在前面被用同樣的參數調用過.
clientflag 可選。client_flags 參數可以是以下常量的組合:
•MYSQL_CLIENT_SSL - 使用 SSL 加密
•MYSQL_CLIENT_COMPRESS - 使用壓縮協議
•MYSQL_CLIENT_IGNORE_SPACE - 允許函數名后的間隔
•MYSQL_CLIENT_INTERACTIVE - 允許關閉連接之前的交互超時非活動時間
返回值:如果成功,則返回一個 MySQL 連接標識,失敗則返回 FALSE.
提示和注釋
注釋:腳本一結束,到服務器的連接就被關閉,除非之前已經明確調用 mysql_close() 關閉了.
提示:要創建一個持久連接,請使用 mysql_pconnect() 函數.
例子,代碼如下:
- <?php
- $con = mysql_connect("localhost","mysql_user","mysql_pwd");
- if (!$con)
- {
- die('Could not connect: ' . mysql_error());
- }//開源代碼Vevb.com
- // 一些代碼...
- mysql_close($con);
- ?>
mysql_connect與mysql_pconnect的區別
這倆函數用法上差不久不多,網上有說應當用pconnect的,pconnect是個好器材,也有視pconnect如洪水猛獸的,果斷不讓用pconnect的,也有立場模糊不清的,那這個器材到底如何呢?
永遠鏈接并不是說,辦事器打開了一個連接,然后所有的人都共享這個鏈接,永遠連接一樣是每個客戶端來就打開一個連接,有200人接見就有200個連接,其實mysql_pconnect()本身并沒有做太多的處理懲罰,它獨一做的只是在php運行停止后不主動close掉mysql的連接.
在php經cgi體式格式運行時pconnect和connect是根蒂根基沒有區此外,因為cgi體式格式是每一個php接見起一個過程,接見停止掉隊程也就停止了,資料也全開釋了.
當php以apache模塊體式格式運行時,因為apache有應用過程池,一個httpd過程停止后會被放回過程池,這也就使得用pconnect打開的的那個mysql連接資料不被開釋,于是有下一個連接懇求時就可以被復用.這就使得在apache并發接見量不大的時辰,因為應用了pconnect,php節儉了反復連接db的時候,使得接見速度加快.
這應當是斗勁好懂得的,然則在apache并發接見量大的時辰,若是應用pconnect,會因為之前的一些httpd過程占用的mysql連接沒有close,則可能會因為mysql已經達到最大連接著,使得之后的一些懇求永遠得不到滿足.若mysql最大連接數設為500,而apache的最大同時接見數設為2000,假設所有接見都邑請求接見db,并且操縱時候會斗勁長,當前500個懇求的httpd都沒有停止的時辰,之后的httd過程都是無法連接到mysql的(因已經達到mysql最大連接 數),只有當前500個httpd過程停止或被復用才可以連接獲得了mysql.
當db操縱錯雜,耗時較長時,因httpd會fork很多并發過程處理懲罰,而先產生的httpd過程不開釋db連接,使得后產生的httpd過程無法連上db. 因為如許沒有復用其它httpd過程的mysql連接,于是會就產生很多連接超時,在并發接見量不高時,應用pconnect可以簡單進步接見速度,但在并發量增大后,是否再應用pconnect就要見地度員的選擇了.
就我小我認為,php如今對mysql的連接并沒有真正用到連接池,pconnect也只是相當于借了apache的過程池來用,所以在并發接見量大的時辰pconnect并不克不及很好的進步接見db效力.
在實際的應用中,用mysql_pconnect的話,每次刷新和懇求新的頁面都斗勁快,而用mysql_connect的話,每次刷新都要從頭懇求,當數據庫連接斗勁慢的時辰,就能看出差別了。當你的數據庫連接斗勁慢,DB操縱不是很錯雜,并且你的法度足夠自負,不會產存亡鎖的時辰,或者你擁有對辦事器的把握權,滿足以上四個前提中的隨便率性兩個,那就可以用pconnect.
pconnect不消在腳本里封閉,可以在mysql中設置lifetime,也可以寫shell按期掃描,kill掉休眠過長的連接,一句話總結:要用好pconnect,不僅僅是php腳本的事,還關系到數據庫和辦事器的設置.
新聞熱點
疑難解答