iT邦幫忙

0

MySQL connect and pconnect

chan15 6 年前11069 瀏覽

爬了好多文,反而越看越 confuse
想直接請教什麼時候適合用哪種
相簿型的網站會一直看照片,也就是說換頁動作應該會很繁複
是不是比較適合 pconnect?

fillano iT邦超人 1 級 ‧ 4 年前 檢舉
今天改寫了一下廠商做的db class,卻發生「not a valid mysql-link resource」的錯誤訊息。仔細trace了一下,發現是mysql_connect跟mysql_close造成的。

mysql_connect()跟mysql_close()在使用時有一些細節要注意:

1. 如果要自己完全掌握mysql_connect產生的mysql-link resource,記得要多加一個參數:
$conn = mysql_connect($host, $user, $password, true);

這樣mysql_connect才會產生一個新的mysql-link resource,否則他會沿用之前產生的...這樣在呼叫:
mysq_close($conn);

時,就會把這個mysql-link resource關閉,更慘的是,下一次再呼叫mysql_connect時,獲得的還是這個mysql-link resource,然後所有查詢都會失敗XD

2. 呼叫mysql_close()時,記得要加入要關閉的mysql-link做參數,不然他會去找已有的mysql-link resource...

不過每次呼叫mysql_connect都真正產生一個新的mysql-link是比較花系統資源的,而mysql-link在request結束時就會自動被mysql_close(),所以使用上還是要好好評估比較好。通常必須產生不同mysql-link的場合,主要是同時連接到不同的資料庫。

2 個回答

6
fillano
iT邦超人 1 級 ‧ 6 年前
最佳解答

跟換頁應該沒直接關係吧?(也不是沒有)

mysql_connect會在程式執行完畢後關閉,或是在呼叫mysql_close()時關閉connection。

mysql_pconnect的connection不會關閉,即使呼叫mysql_close()也一樣。反之,在呼叫mysql_pconnect時,他會先找有沒有可用的connection(未被其他php或程式使用),有的話就使用它,沒有的話才建立新的。

建立connection需要時間及資源,所以一般來說,使用mysql_pconnect是比較有效率的,但是因為connection在使用過後不會關閉,所以平均來說會使用較多的資源。(這個方式,就是Connection Pool,你在使用Java的Application伺服器應該就會聽到這個名詞)

換頁,除非你是使用AJAX而不是變動網址,那對PHP來說應該會結束一個程式,然後啟動另一個程式。即使你不是把相片存在mysql中,也沒有呼叫mysql_close()等等,如果使用的是mysql_connect的話,php的mysql模組還是會幫你做mysql_close()。使用mysql_pconnect比較沒有這樣的顧慮。

建議你看一下:
http://www.php.net/manual/en/features.persistent-connections.php
http://www.php.net/manual/en/function.mysql-pconnect.php
http://www.php.net/manual/en/function.mysql-connect.php

如果懷疑你的mysql設定不夠好,至少:
http://blog.wu-boy.com/2009/11/mysql-%E5%BF%85%E8%A6%81%E4%BF%AE%E6%AD%A3%E4%B8%80%E4%BA%9B%E9%A0%90%E8%A8%AD%E5%80%BC-performance-tunning/ <--要改這裡面提到的這四個設定,雖然有點囧。

tsung的blog上有很多他管理mysql伺服器的心得,有空的話不妨去逛逛:
http://blog.longwin.com.tw/

6
wiseguy
iT邦超人 1 級 ‧ 6 年前

使用 mysql_connect 必須自己用 mysql_close 關閉,好處是可以確保沒有閒置浪費的 connection;壞處是每次得重新連線,效率較不好,而且萬一沒有用 mysql_close 關閉,那麼那個連線會一直浪費著,無法被 reuse,直到 wait_timeout 到了之後,才會被回收。

使用 mysql_pconnect 好處是不必用 mysql_close 關閉,而且沒有重新連線的成本 (除非已過了 wait_timeout 時間), 只要同一 user 持續在使用,那麼這個連線就一直被 reuse。

我的建議是,如果你是設計 Windows AP / Linux AP,那麼使用 mysql_connect,自己掌握連線與斷線。因為這類軟體有 exception/error handler 可以捕捉異常,避免連線沒 close 而浪費。

如果你是設計 Web AP,那麼建議使用 mysql_pconnect,並且在 MySQL 的設定中,把 wait_timeout 縮短,它預設是閒置 24 小時後才會回收,你可以調整成比如 wait_timeout = 600,即閒置 10 分鐘就回收。這樣就不必擔心會浪費連線數了。

chan15 iT邦新手 5 級 ‧ 6 年前 檢舉

咦,我爬文的結果是得到說 PHP 一結束就會自動 close 耶
不用再下 mysql_close

wiseguy iT邦超人 1 級 ‧ 6 年前 檢舉

是沒錯。但不是每種語言都像PHP這麼貼心喔~ 更何況也不是每支PHP都要程式結束才把 mysql connection 關閉。最重要的是,去依賴程式語言幫你關掉連線,是不良的程式習慣。
所以除非你不在乎 mysql 重連成本 (高流量網站會很明顯喔),更不在乎什麼程式風格。如果不想要去下 mysql_close,那建議還是用 mysql_pconnect。

我要發表回答

立即登入回答