簡體   English   中英

連接池與持久連接mysqli

[英]Connection pooling vs persist connection mysqli

我讀過mysqli介紹了mysql中沒有的連接池。 http://php.net/manual/en/mysqli.quickstart.connections.php

我已經閱讀了這個問題 ,解釋了連接池和持久連接之間的區別。

Persistent connectionmysqli文檔中,他們寫道:

如果在連接池中找不到主機,用戶名,密碼,套接字,端口和默認數據庫的給定組合的未使用的持久連接,則mysqli將打開一個新連接。

那么,mysqli是否使用連接池來實現持久連接?

如果是,那么mysqli中連接池和持久連接之間有什么區別?

如果不是,那么mysqli如何為持久連接執行連接對象的查找?

實際上,術語連接池持久連接在PHP中的mysqli的情況下引用相同的東西。

在這種情況下, 持久連接是指從PHP腳本打開的MySQL連接,該腳本在腳本執行完畢后保持打開狀態,以便在稍后的某些執行中再次使用。

連接池意味着PHP維護了一個持久連接池。 來自此池的一個空閑連接被提供給PHP腳本,該腳本想要連接到MySQL並在腳本完成時返回到池。

您可能想知道為什么我們需要MySQL連接池,為什么我們不為所有腳本只使用一個持久連接?

有兩個原因:

  • PHP根據使用的host/port/username/password創建一個MySQL連接池。 如果一個腳本想要使用某些host/port/username/password組合連接到MySQL,PHP將搜索具有相同值的空閑持久連接。 如果找不到,則使用此host/port/username/password組合創建新的持久連接。 因此,我們需要至少與所有腳本使用的不同host/port/username/password值一樣多的不同持久連接。
  • 您不能同時在一個MySQL連接上執行兩個SQL命令。 當兩個PHP腳本同時執行時,可能會發生這種情況。 當兩個腳本想要同時與MySQL通信時,會創建兩個持久的MySQL連接。 池中的持久連接數等於執行的最大並行PHP腳本的最后數,或等於php.ini設置的上限。

重要的提醒:

僅當PHP作為Web服務器插件執行時, MySQL連接池(以及任何其他連接池) 才能存在 池在以快速cgi模式工作時不起作用,或者在腳本執行后PHP可執行文件終止時以任何其他方式工作。

編輯:如果將Web服務器配置為針對多個請求重用一個PHP fast-cgi進程,則可以在PHP的fast-cgi模式中使用MySQL連接池。 如果PHP fast-cgi進程配置為在提供一個請求后退出,那么它的所有MySQL連接都將被關閉。

libmysql18 ,它查找任何現有的默認mysql sock/port並使用憑據對其進行測試。 如果找不到,則調用c ++函數clone() ,創建新的連接對象(Resource)。 在某些情況下,這可能導致堆棧溢出。 我不熟悉它在mysqlnd (本機驅動程序)中的工作原理。 也許別人是。 如果您想了解有關其工作原理的更多信息,請安裝一個版本的facebooks HHVM-debug軟件包,並嘗試通過多個嵌套函數中的全局傳遞連接。 這可以在HHVM下觸發堆棧溢出,這將顯示在該異常之前調用的每個函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM