首頁  >  文章  >  後端開發  >  mysql - php操作資料庫的連線與釋放怎麼做比較好?

mysql - php操作資料庫的連線與釋放怎麼做比較好?

WBOY
WBOY原創
2016-08-04 09:20:141505瀏覽

在手冊中,每個查詢完成後,都會關閉連線。那麼當有多個資料庫操作的時候這樣就導致不停的生成與釋放連接,是不是不合理?

例如,有一個a.php,裡面有20個函數,分別要實例化20個對象,每個對像都有資料庫操作。

那麼,有三種方法:
1.在20個物件的每個類別中分別獲得一個資料庫連接,操作完成並關閉。
2.在a.php中獲得資料庫連接,在每個函數中,把連接傳參進去,最終在a.php釋放。
3.產生一個靜態的資料庫連接對象,每個類別調用ConnectionClass::db

怎麼樣比較好,請大家討論討論。

.

回覆內容:

在手冊中,每個查詢完成後,都會關閉連線。那麼當有多個資料庫操作的時候這樣就導致不停的生成與釋放連接,是不是不合理?

例如,有一個a.php,裡面有20個函數,分別要實例化20個對象,每個對像都有資料庫操作。

那麼,有三種方法:
1.在20個物件的每個類別中分別獲得一個資料庫連接,操作完成並關閉。
2.在a.php中獲得資料庫連接,在每個函數中,把連接傳參進去,最終在a.php釋放。
3.產生一個靜態的資料庫連接對象,每個類別調用ConnectionClass::db

怎麼樣比較好,請大家討論討論。

.

用一個靜態變數保存資料庫連線就可以實現在一個請求中多個函數只連接一次資料庫了.
如果再開啟持久連接,就可以實現一個PHP-FPM進程在多次請求中共享一個資料庫連線了.
mysql - php操作資料庫的連線與釋放怎麼做比較好?

<code><?php
function db() {
    static $db; //静态变量
    if ($db) {
        return $db;
    } else {
        $db = new mysqli('p:127.0.0.1','user','pass','dbname',3306);
        return $db;
    }
}
function foo1() {
    return db()->query('SELECT * FROM table1')->fetch_all();
}
function foo2() {
    return db()->query('SELECT * FROM table2')->fetch_all();
}
var_export( foo1() );
var_export( foo2() );</code>

@impig33 下面兩次函數呼叫回傳結果都是一樣的,可見$db被第一次賦值後,第二次不會再去執行else裡的分支,也就不會再產生一個uniqid數.

<code><?php
header('Content-Type: text/plain; charset=utf-8');
function db() {
    static $db; //静态变量
    if ($db) { return $db; } 
    else { $db = uniqid(mt_rand(), true); return $db; }
}
function foo1() { return db(); }
function foo2() { return db(); }
echo foo1()."\n";
echo foo2()."\n";</code>

其他資料庫我不清楚,MySQL是支援持久化連線的。
持續連接不會關閉先前的資料庫連接,下次連接時直接使用先前的連接。

MySQLi並沒有類似MySQL的pconnect()函數,但你可以連接時在主機名稱前增加p:,參考PHP官網:mysqli擴充與持久化連線 。感謝@eechen 的指正。

不像mysql擴展,mysqli沒有提供一個特殊的方法來開啟持久化連接。需要開啟一個持久化連線時,你必須在 連線時在主機名稱前增加p:。

PDO也支援長連結:在new PDO的第4個參數中使用array(PDO::ATTR_PERSISTENT),參考PHP官方手冊 —— PDO 連線與連線管理 Example4。

3唄,這個不需要討論。通常Db物件都採用單件模式的,已經是共識了。

個人認為2最好。

另外也可以考慮使用連接池
https://www.baidu.com/s?wd=ph...

我也覺得3好支持單例模式

不知道如何寫這個答案。
一堆東西: 對象,析構函數,單例,依賴注入,持久化連接
最後突然覺得這事也不難,樓主去找個框架分析下就都懂了,例如phalcon之類的。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn