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

來源:互聯網
上載者:User
在手冊中,每個查詢完成後,都會關閉串連。那麼當有多個資料庫操作的時候這樣就導致不停的產生與釋放串連,是不是不合理?

比如,有一個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進程在多次請求中共用一個資料庫連接了.

query('SELECT * FROM table1')->fetch_all();}function foo2() {    return db()->query('SELECT * FROM table2')->fetch_all();}var_export( foo1() );var_export( foo2() );

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

其他資料庫我不清楚,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之類的。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.