我在項目中使用PHP的PDO層進行數據訪問,並且我一直在閱讀它,並且看到它對持久數據庫連接具有良好的固有支持。我想知道我是否應該使用它們。我會看到一個CRUD重型應用程序的性能優勢嗎?是否有缺點需要考慮,可能與安全有關?持久性數據庫連接 - 是或否?
如果對你很重要,我使用MySQL 5.x.
我在項目中使用PHP的PDO層進行數據訪問,並且我一直在閱讀它,並且看到它對持久數據庫連接具有良好的固有支持。我想知道我是否應該使用它們。我會看到一個CRUD重型應用程序的性能優勢嗎?是否有缺點需要考慮,可能與安全有關?持久性數據庫連接 - 是或否?
如果對你很重要,我使用MySQL 5.x.
您可以使用此作爲一個粗略的「規則集」:
YES,使用持久連接,如果:
NO,不使用持久連接,如果:
使用持久連接速度要快得多,特別是在通過網絡訪問數據庫時。如果數據庫運行在同一臺機器上,它並沒有太大的區別,但速度還是比較快。但是 - 正如名稱所述 - 連接是持久的,即保持打開狀態,即使未使用。
問題是,在「默認配置」中,MySQL只允許1000個並行「開放通道」。之後,新的連接被拒絕(你可以調整這個設置)。因此,如果您擁有20個Web服務器,每個客戶端上有100個客戶端,並且每個客戶端每小時只有一個頁面訪問權限,那麼簡單的數學計算將告訴您需要2000個並行連接到數據庫。這是行不通的。
錯誤:只能用於有很多請求的應用程序。
創建到數據庫的連接是一個相當昂貴的操作。持久連接是一個好主意。在ASP.Net和Java世界中,我們有「連接池」,這是大致相同的事情,也是一個好主意。
IMO,這個問題的真正答案是任何最適合你的應用程序。我建議你使用持久連接和非持久連接來測試你的應用程序。
Maggie Nelson @Objectively Oriented在八月份發佈了此消息,Robert Swarthout發表了一些帶有硬編號的附帶帖子。這兩個都很不錯。
「客觀導向」鏈接已關閉。 – Pacerier 2015-06-25 07:23:37
我不喜歡這個答案,因爲基準測試通常是以非常不準確的方式完成的。您的計算機在「除真實世界訪問模式之外」(這是典型的測試)訪問它時,它可能看起來非常好。時間安排非常重要,正如現實生活中經常發生的其他一些「難以複製」的情況一樣。除非你肯定會需要它,否則我會建議你仔細考慮並避免它。預優化是第一個罪。 – 2016-06-15 16:16:48
在我的愚見:
當使用PHP的Web開發,大部分的連接將只「活」的頁面的生命執行。持續的連接會花費你很多的開銷,因爲你必須把它放在會話或某些事情中。
99%的時間在頁面執行結束時死亡的單個非持續性連接將工作得很好。
其他1%的時間,你可能不應該使用PHP的應用程序,並沒有完美的解決方案。
我打算問同樣的問題,而不是再次問同樣的問題,我只是添加一些我發現的信息。
還值得一提的是,新的mysqli擴展甚至不包括使用持久的數據庫連接的選項。
我目前仍在使用persitent連接,但計劃在不久的將來切換到非持久連接。
一般來說,有時候需要使用非持久連接,並且很有必要將單個模式應用於db連接設計(只要在您的上下文中使用持久連接的可能性相對較小)。
簡而言之,我的經驗表明,儘可能避免長久連接。
請注意,mysql_close是使用mysql_pconnect創建的連接的無操作(無操作)。這意味着持久連接不能被客戶隨意關閉。當連接上沒有任何活動發生超過wait_timeout的連接時,mysqldb服務器將關閉此連接。如果wait_timeout是很大的值(比如30分鐘),那麼mysql數據庫服務器可以很容易地達到max_connections的限制。在這種情況下,mysql數據庫不會接受任何未來的連接請求。 這是您的傳呼機開始發出嗶嗶聲。
爲了避免達到max_connections的限,使用持久連接需要以下變量小心平衡...
1. Number of apache processes on one host
2. Total number of hosts running apache
3. wait_timout variable in mysql db server
4. max_connections variable in mysql db server
5. Number of requests served by one apache process before it is re-spawned
所以,PL使用足夠的審議後永久連接。您可能不想邀請複雜的運行時問題,以獲得持久連接的小增益。
另外,如果您在prefork模式下使用Apache,請勿使用持久連接。它爲每個子進程使用一個連接,可以相當快速地進行。 – Powerlord 2008-11-10 19:28:49
@BlaM,我沒有得到你的最後一段。是否持久連接允許您重用它們(這就是整個重點?),所以您不需要2000個連接,因爲它們將被重用?或者你的意思是**每個客戶**都有一個唯一的用戶名?即便如此,當舊連接連接完成後,新連接將不會自動關閉? – Pacerier 2015-06-25 07:01:28