PHP開發非同步高效能的MySQL代理伺服器

發表於2015-09-26

MySQL資料庫對每個客戶端連線都會分配一個執行緒,所以連線非常寶貴。開發一個非同步的MySQL代理伺服器,PHP應用伺服器可以長連線到這臺Server,既減輕MYSQL的連線壓力,又使PHP保持長連線減少connect/close的網路開銷。

此Server考慮到了設定了資料庫連線池尺寸,區分忙閒,mysqli斷線重連,並設定了負載保護。基於swoole擴充套件開發,io迴圈使用epoll,是全非同步非阻塞的,可以應對大量TCP連線。

程式的邏輯是:啟動時建立N個MySQL連線,收到客戶端發來的SQL後,分配1個MySQL連線,將SQL發往資料庫伺服器。然後等待資料庫返回查詢結果。當資料庫返回結果後,再發給對應的客戶端連線。

核心的資料結構是3個PHP陣列。idle_pool是空閒的資料庫連線,當有SQL請求時從idle_pool中移到busy_pool中。當資料庫返回結果後從busy_pool中再移到idle_pool中,以供新的請求使用。當SQL請求到達時如果沒有空閒的資料庫連線,那會自動加入到wait_queue中。一旦有SQL完成操作,將自動從wait_queue中取出等待的請求進行處理。

如此迴圈使用。由於整個伺服器是非同步的單程式單執行緒所以完全不需要鎖。而且是完全非同步的,效率非常高。

當然本文的程式碼,如果要用於生產環境,還需做更多的保護機制和壓力測試。在此僅拋磚引玉,提供一個解決問題的思路。

 

相關文章