現有PHP項目引入Swoole4協程支持的流程及難點
Swoole4以後,協程化支持已經完善,而且支持大量的PHP擴展自動協程化.一些基於Swoole4的框架也蓬勃發展,光看着文檔就讓人躍躍欲試.
可是對於現有舊項目如何引入並啓用Swoole協程成了實際場景中的客觀問題,因爲協程性質及生命週期等緣由,這並不是想象的那麼容易.
本文整理了在現有項目中引入Swoole4並開啓協程的一些步驟及須要注意的問題,指望能夠爲有須要的人提供幫助.
前置要求
請閱讀Swoole文檔中
環境依賴的章節,本文只針對代碼部分的調整.下文默認已成功編譯安裝了Swoole4擴展.
框架代碼部分
首先請查閱所用框架是否有結合Swoole的開源方案,如laravel-s等.若有可按需選用,如沒有也參照業務代碼部分對框架代碼進行改造.(
這會致使升級框架版本變困難)
業務代碼部分
- 首先閱讀Swoole文檔中協程編程須知的章節.
- 對單例對象按協程ID作隔離,防止單例對象跨協程使用.對Mysql,Redis等鏈接資源須要defer進行回收複用或關閉,防止鏈接數持續增長.
- 對全局變量及常量作評估,全部可能引發問題的地方所有按協程ID作隔離.
- 對項目內直接echo,print之類輸出的位置作修改,或使用ob_start方法進行獲取輸出內容進行處理.
- 對項目內使用不支持自動協程化的庫作修改,採用協程客戶端進行替換.(如:curl).
- 對項目內使用exit,die的地方作修改.
- 對static靜態類,屬性或變量及引用傳遞進協程的變量都要當心操做,儘可能避免這種狀況,只使用局部變量.
- 對每次修改作好單元測試,作好備份及回滾措施.
- 可從某些單一場景下入手逐步進行修改.(如:某個單一業務模塊,某個簡單PHP腳本等).
總結
上述修改看似內容很少,可是在一個現有的項目中進行修改並保證服務正常運行卻並不是易事,但願你們當心操做,早日成功.
歡迎關注本站公眾號,獲取更多信息