1. 程式人生 > >使用Phalcon+PHP-FPM構建PHP基於多程序的資料庫連線池

使用Phalcon+PHP-FPM構建PHP基於多程序的資料庫連線池

之前看到網上有一篇文章說Phalcon和PHP沒有資料庫連線池,而swoole本身提供了很好的資料庫連線池。實際上這是一種誤解,PHP自身早就實現了持久化的資料庫連線。而Phalcon基於zephir寫的資料庫連線介面卡,必然也是支援PHP自身實現的這種資料庫連線池。Phalcon基於C語言寫的ORM,配合PHP-FPM提供的多程序的PHP資料庫連線池,將提供效能極為強悍並且健壯的多程序資料庫連線池。苦逼的是我大Phalcon文件太爛,根本就沒提到這方面的先天優勢。根本不需要swoole,nginx與php-fpm的黃金搭檔以及phalcon提供的高效能ORM,就能提供目前最好的PHP資料庫連線池解決方案。本文將詳述,有關PHP資料庫連線池的相關技術。

第一:PHP官方文件有關持久化資料庫連線的有關闡述

下圖就是PHP官方網站,對於PHP持久化資料庫連線問題的一些闡述。

github

這裡需要特別注意的一個問題是,由於指令碼語言的特殊性,PHP官方並不建議在鎖表或者事務操作的時候,使用PHP的持久化資料庫連線。如圖一所示,害怕資料庫鎖死

第二:PHP-FPM提供的程序複用機制給PHP提供了健壯的PHP資料庫連線池

下圖中所示的,就是PHP-FPM的配置檔案。關於配置檔案,PHPer都看得懂,我就不多說了。主要說說PHP-FPM帶來的PHP資料庫連線池的特色:

github

  1. PHP-FPM一個程序對應一個持久化的資料庫連線;

  2. 所有PHP-FPM程序所創造的持久化資料庫連線,不能超過mysql的最大資料庫連線數的,預設max_connections為150個連線。所以,不管是動態還是靜態管理PHP-FPM程序,都需要注意PHP-FPM的程序數和mysql的最大連線數。

  3. 如果一個PHP請求,請求了多個不同資料庫的資料,建立了多個持久化的資料庫連線。那麼對應的PHP-FPM就會在一個程序內建立多個持久化的資料庫連線。這裡是一個比較坑的地方,所有PHPer都應該注意。

假設伺服器有100個PHP-FPM的程序,單個請求向5個不同的資料庫請求持久化連線的資料,那麼伺服器將會建立500個持久化的資料庫連線。

第三:PHP實現資料庫連線池的條件

github

如上圖中所示,只有在new Pdo()時使用了Pdo::PERSISTENT=ture屬性構造資料庫連線時,這個連線才會成為持久化的資料庫連線。但是問題來了,new Pdo()時,綁定了資料庫的地址、庫名和使用者名稱。也就是說,同一資料庫的同一使用者產生的資料庫連線,才會複用這個資料庫持久連線。

這是PHP資料庫連線池的另外一個問題。

第四:Phalcon框架支援PHP內建的資料庫連線池

雖然Phalcon官方文件並沒有提及PDO的資料庫連線池,但是翻看Phalcon的PDO類的原始碼,就會發現Phalcon實際上是支援PDO的資料庫連線池。如下圖所示:

github

不僅僅支援PHP的資料庫連線池,而且他用C語言寫的ORM,效能要比所有的PHP語言寫的ORM要強很多。也就是說Phalcon的ORM及與PHP-FPM實現的資料庫連線池,就是目前PHP所有框架中資料庫連線池效能最強的。

yaf框架雖然路由效能比phalcon略好,但是由於沒有ORM,在拉取PHP所寫的ORM後,其ORM效能要比Phalcon內建的C語言所寫的PHQL要差。

第五:Phalcon專案內資料庫連線池的實現方式

Phalcon實現持久連線的方式很簡單,如下圖所示,配置檔案裡在註冊服務時新增一個PDO的引數即可。所有通過這個請求的資料庫連線,都將成為持久化的連線。

github

但是由於,PHP資料庫連線池的特殊性。最好通過註冊不同的資料庫連線服務,來區分不同的資料庫連線。甚至針對高查詢量的請求,建立帶有專用資料庫連線池的微服務,來實現與其他不需要資料庫連線池業務的區分。

在如今微服務大行其道的情況下,PHP這種需要區別對待的資料庫連線池,反而更容易使用了。

第六:關於需要鎖表操作和事務操作的資料庫連線池

PHP官方建議不要在鎖表和事務操作的時候,使用資料庫連線池。個人的看法是,一個專案中需要鎖表和事務操作的地方,往往並不多,兩者完全可以不走資料庫連線池。程式設計師可以通過其他辦法,儘量少寫鎖表操作。而對於併發較少的事務操作,用完連線就扔了,不走資料庫連線池也沒什麼不可。

畢竟鎖表和事務操作,真正需要用的並不是太多。實在不行的話,也可以用其他語言來寫吧。諸如:Java,Go,C#,.NET Core等,通過他們搭建少量的微服務專門服務於鎖表和事務操作作為補充,也未嘗不可。

總結

如本文所示,通過nginx+php-fpm+phalcon就能通過效能極好的ORM搭建基於多程序的資料庫連線池。根本不需要swoole擴充套件,就能實現php的資料庫連線池。而且這種基於多程序的資料庫連線池,比基於多執行緒的資料庫連線池更加健壯和安全。

PHP的Phalcon框架,跟隨PHP-FPM常駐記憶體,本身處理HTTP請求的效能極強。而且自帶C語言所寫的ORM,通過PHP-FPM實現基於多程序的資料庫連線池,再搭配Nginx強大的HTTP處理能力,這真是完美的Web組合啊。

公司同事用最新版的Go在本地測試,跑了7000每秒的併發請求。鳥哥之前做的測試,Phalcon可是能跑到14000的RQS。哈哈,我大Phalcon真是吊的飛起呢。以後加上JIT和資料型別,PHP未來會更加強大。