簡體   English   中英

在 MySQL 中使用持久連接但仍然有許多打開的連接

[英]Using persistent connections in MySQL but still many open connections

我有一個用於回調 api 的聊天機器人,每次有人寫消息時它都會在我的服務器上發送一個請求

最近,我讀到了所謂的持久連接,這讓我覺得每次在服務器上收到請求時都可以避免重新連接到數據庫,因為數據庫加載需要一些時間,我想加快該過程

因此,我已將腳本中的任何連接更改為具有p:前綴,如下所示

$conn = new mysqli("p:".$servername, $username, $password, $dbname);

據我所知,這樣 mysqli 會找到一個具有相同參數的現有連接,或者如果它不存在則創建一個,而不是每次都打開一個新連接

但是,幾個小時后,我檢查了打開的連接,我注意到一堆類似的連接,只是它們的ID不同,就像這樣

  ID      | USER | HOST      | DB       | COMMAND | TIME | STATE | INFO |
+---------+------+-----------+----------+---------+------+-------+------+
| 5248403 | user | localhost | database | Sleep   |   24 |       | NULL |
| 5248609 | user | localhost | database | Sleep   |  113 |       | NULL |
| 5247822 | user | localhost | database | Sleep   |    1 |       | NULL |
| 5248652 | user | localhost | database | Sleep   |   79 |       | NULL |

userdatabase屏蔽了實際用戶和數據庫)


我對持久連接有什么誤解嗎? 我該怎么做才能避免類似的連接?

持久連接可以被后續請求重用,但如果您的站點正在處理多個並發請求,它們每個都需要自己的連接。

換句話說,多個並發 PHP 請求不能同時使用同一個數據庫連接。

MySQL處理多個連接不是問題。 MySQL 8.0 中默認的max_connections限制設置為 151,但如果您的服務器足夠強大,它可以更高。 在我的工作中,我們使用高端數據庫服務器,因此我們將max_connections提高到 4096。但我們提醒開發人員,他們可能不希望它超過 1024。通常我們看到連接數保持在幾百個。

一個教科書般的XY問題

數據庫加載需要一些時間,我想加快這個過程

我有一種感覺,如果有的話,持久連接將是解決問題的最后選擇。

據我所知,這樣 mysqli 會找到一個具有相同參數的現有連接,或者如果它不存在則創建一個,而不是每次都打開一個新連接

實際上遠非如此。 PHP 中的持久連接綁定到 PHP 在其中執行的多個線程。每個碰巧打開連接的線程將保持它進一步打開,為將要執行的腳本提供這個已經打開的連接。 表示持久連接是持久的,或者換句話說,持久打開。

因此,您可以看到的圖片是預期的。

只要您沒有遇到“連接過多”的錯誤,就可以了,盡管我懷疑使用持久連接是否有明顯的好處。

我猜這是連接池。 在您的情況下,它創建了一個包含 4 個連接的池,可用於並行處理 4 個請求/查詢。 如果您只有 1 個連接並且正在其上運行查詢,則任何其他需要數據庫的請求都必須等待。

另一種解釋可能是您的 Web 服務器正在運行 4 個子進程來並行處理多個請求,因此每個子進程創建/獲取它自己的連接,它可以在內部重用

這可以說適用於許多其他網絡服務器/框架,而不是特定於 php/mysqli

是的,我相信你有點誤解了什么是持久連接。

我明白了,這樣 mysqli 會找到一個具有相同參數的現有連接,或者如果它不存在就創建一個,而不是每次都打開一個新連接

當您使用持久連接時,PHP 不會在 PHP 腳本結束執行時請求關閉連接。 相反,連接將保持活動狀態,如果處於空閑狀態,PHP 可能會再次重用該連接。

無論如何,同一腳本的每次執行都需要一個單獨的連接。 如果沒有可重用的連接,那么 PHP 將嘗試打開一個新的持久連接。

這只是災難的一個秘訣。 如果您沒有正確手動清理連接,您會看到一些奇怪的行為。 如果您不需要使用它們,最好遠離它們。 使用持久連接只能使您更快地達到max_connections限制。

如果您在 localhost 上使用 MySQL,這似乎是這種情況,您不會看到太多的性能提升。 幾乎沒有理由進行如此小的優化。 打開和關閉連接通常是一個非常快速的過程,尤其是在本地主機上。

暫無
暫無

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

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