PHP 遇见 Serverless,帮你解决这些痛点
作者:羅松(西流)
前言
PHP 的應用范圍相當廣泛,尤其是在網頁程序的開發(fā)上, 根據最新維基百科 [1] 顯示,2013 年 4 月的統(tǒng)計資料,PHP 已經被安裝在超過 2 億 4400 萬個網站和 210 萬臺服務器上, 而根據 W3Techs [2] 的報告,截至 2021 年 9 月, 有 78.9%的網站使用 PHP。所以 PHP 是世界第一語言至少在 web 開發(fā)領域并不是戲稱。
而在技術選型上,PHP 主要采用的是 LAMP(全稱是Linux + apache + mysql + php) 或者 LNMP(全稱是Linux + nginx + mysql + php),這種成熟穩(wěn)定的技術框架推動 PHP web 開發(fā)生態(tài)的繁榮和商業(yè)上的成功。
在傳統(tǒng)的開發(fā)模式中,開發(fā)者自己需要安裝維護各種軟件的安裝、維護升級:
- 如果您是一個企業(yè)用戶,如果業(yè)務體量變大或者為了生產環(huán)境的穩(wěn)定和可用性,使用負載均衡是一個必然的選項:
即此時,PHP 開發(fā)者或者線上運維的同學關心的事情多了起來:
-
每個增加的生產機器都需要重新安裝一遍相關軟件,做相同的 nginx 配置以及 php-fpm 的配置,以及維護每個生產機器的安全更新;
-
假如開發(fā)的應用需要一個新的擴展,可能需要人肉每臺機器去增加擴展;
-
負載均衡器隨著業(yè)務的變更升配,后面一臺 Worker 機器掛掉了,如何做運維處理?
-
業(yè)務的波峰波谷怎么應對才能讓資源的利用率提高?
如果您是項目組開發(fā)成員比較多的企業(yè)用戶,能不能不需要給每個開發(fā)配置一個安裝的 NLP 的 Linux 機器作為開發(fā)測試機器(或者多人共享一個機器)?
如果您是一個提供網站開發(fā)和托管的 ISV、外包公司或者創(chuàng)業(yè)公司,我的客戶都是一些中小企業(yè)的門戶網站,我怎么提高我后端機器資源利用率以及更好提供定制化服務?
如果您是一個學生或者準備學習 PHP 開發(fā),本地只有 Windows 電腦,能不能直接近乎免費的方式獲取 LNP(Linux+Nginx+PHP) 的環(huán)境用來學習呢?
帶著這些問題, 我們去探索一下 Serverless 是如何解決這些痛點的。
PHP 遇見 Serverless
什么是 Serverless?
Serverless = Faas (Function as a service) + Baas (Backend as a service),我們簡單通過兩個圖快速了解相關概念:
- 傳統(tǒng)模式
- Serverless 模式
圖中的 CDN 和 OSS 就是 BaaS 服務,FC 就是自定義函數邏輯的 FaaS 平臺, 通過這個對比,我們能快速得到 FaaS 的特性和好處:
- 只需要專注業(yè)務代碼開發(fā), 編寫對應的邏輯即可
- 極致彈性伸縮, 無需管理服務器
- 按量付費,每次調用按毫秒計費
- …
本文后續(xù)討論的 Serverless 主要指的是 FaaS,如下示意圖,幾行代碼編寫完畢,保存到云廠商的 FaaS 平臺,就完成了一個彈性高可用的 Web API。
PHP 遇見 Serverless
PHP 作為一個開發(fā)群體的很大的語言,各大云廠商的 FaaS,比如阿里云的函數計算、AWS 的 Lambda (通過 Custom Runtime [3] 間接支持)、騰訊的 SCF 等都推出了對 PHP 語言的支持,phper 面對前端領域的 Serverless 技術革新實踐(感興趣的見本文最后的附錄),應該不遑多讓。以阿里云函數計算為例,有很多 PHP 的開發(fā)者有了很多有趣的實踐:
-
直接使用 gd 或者 ImageMagick 擴展,實現彈性高可用的圖片、水印等各種 CPU 密集型 API
-
直接使用 ffmpeg + 性能型實例 + 異步有狀態(tài)調用完成視頻剪輯合成等音視頻處理業(yè)務
-
使用 HTTP 觸發(fā)器實現的函數, 埋點到廣告平臺, 快速實現高可用的買量業(yè)務
-
直接將之前基于框架(如 ThinkPHP)實現的 WEB API 直接遷移到 FaaS 平臺,不用再擔心宕機和運維問題了
雖然 FaaS 很好地解決了 phper 如下問題:
-
新業(yè)務或者開發(fā)新的 web API
-
存量業(yè)務中, 有些 CPU 密集型或者彈性要求很高的 API 單獨抽離出來 FaaS 化
但是傳統(tǒng)的開發(fā)模式或者存量業(yè)務,對開發(fā)者有一定的上手和改造成本,比如某 Faas 廠商 PHP Runtime 編程接口示例:
function handler($event, $context) {$eventObj = json_decode($event, $assoc = true);// do your thhings// ....return $eventObj['key']; }但是能不能更進一步,開發(fā)者不需要按照 FaaS 廠商的約定的函數入口能實現一個個的API, 而是能直接將傳統(tǒng)運行在 LAMP 或者 LNMP 的項目直接 FaaS 化?答案是肯定的。
阿里云函數計算的 Custom Runtime 以及直接基于 HTTP 協(xié)議的極簡編程模型走在了所有云廠商的前列。
函數計算啟動 Custom Runtime 執(zhí)行環(huán)境時,會默認調用 bootstrap 文件(或者您創(chuàng)建函數的時設置的 Args 參數)啟動您自定義的 HTTP Server,然后這個 HTTP Server 接管了函數計算系統(tǒng)的所有請求,即您所有的函數調用請求。
函數計算 Custom runtime 執(zhí)行環(huán)境底層系統(tǒng)是 Linux, 并且已經內置的 nginx/1.10.3 和 php-fpm7.4, 對于 PHP 應用,您直接使用即可
以部署一個 wordpress [3] 項目為例, 只需要將如下目錄直接打包成一個 zip 包在函數計算平臺創(chuàng)建一個函數即可:
- bootstrap - nginx.conf - php-fpm.conf - php.ini-production - wordpress其中 wordpress 目錄是對應的 web 工程, bootstrap 是啟動 nginx 和 php-fpm 的腳本即可:
... echo "start php-fpm" php-fpm7.4 -c /code/php.ini-production -y /code/php-fpm.conf echo "start nginx" nginx -c /code/nginx.conf ...bootstrap 詳情可參考 WordPress in FC [5] (文末附鏈接)
所以,使用函數計算這個 Serverless 產品和傳統(tǒng)的 PHP 開發(fā)相結合后,您再也不用考慮負載均衡的事情,不用考慮擴縮容的事情,不用管理機器、不用擔心宕機的事情等等,只需要安安心心把業(yè)務代碼開發(fā)好即可。
從上圖可以看出:開發(fā)者只需要開發(fā)好自己的業(yè)務代碼即可,唯一需要考慮的事情,就是函數計算這邊擴容不要太多太猛(比如直接在函數計算平臺設置下該函數能彈出的最大實例數目即可),給下游自己的 Mysql 數據庫過大的壓力即可。
當然, 從原始的傳統(tǒng)的 php web 應用完全遷移到 Serverless 形態(tài)的函數計算平臺,某些場景可能需要考慮數據持久化問題,因為函數計算是無狀態(tài)的,數據持久化保存可以借助 NAS、Redis 等服務完成,以 NAS 為例,流程圖如下:
以 WordPress 為例,后臺系統(tǒng)上傳的圖片或者 Session 功能都是需要持久化到磁盤的。
-
設置 web 工程的文件上傳目錄或者 session 目錄為 NAS 盤的某個目錄, NAS 盤實現持久化
-
甚至可以將 web 工程直接放到 NAS 盤上,此時函數計算純粹就是 LNP 執(zhí)行環(huán)境
比如將 wordpress 工程不作為函數的代碼包的一部分,而已提前上傳到 NAS 盤,只需要設置好 nginx.conf 中的 root 能知道 web 工程即可,如上面的 nginx.conf,/mnt/auto 表示掛載的 NAS 目錄,mnt/auto/wordpress 則表示在 NAS 上的 web 工程。
此時對您來說,函數再也不用變了,您可能只是需要開發(fā)新的業(yè)務代碼,然后上傳到 NAS 上即可(或者直接使用 git 直接在 NAS 操作,實現 web 工程的版本和 git 上的 commit 綁定,使用 git 實現代碼的快速升級和混滾)
但是從安全生產的角度來說,還是建議您 web 工程變更最好和函數的變更相關聯(lián)。
總結
從上面的討論和陳述中,我們不難發(fā)現,PHP 遇見 Serverless 是一件令人興奮的事情,讓 phper 有了更大的想象空間。Serverless 的理念和 PHP 這個語言出現的理念也是一致的: 即讓開發(fā)者最大精力集中在自己的業(yè)務價值。 PHP 語言一直是 web 領域最好的生產力代表,而 Serverless 將會讓 PHP 如虎添翼。
相關鏈接?
[1]維基百科:
https://zh.wikipedia.org/wiki/PHP?
[2]W3Techs:
https://w3techs.com/?
[3]Custom Runtime 簡介:
https://help.aliyun.com/document_detail/132044.html?
[4]wordpress 項目:
https://github.com/devsapp/start-web-framework/tree/master/web-framework/php/wordpress/src?
[5]WordPress in FC:
?https://github.com/devsapp/start-web-framework/blob/master/web-framework/php/wordpress/src/code/bootstrap???
我們最后來一一解答下前言中提出的問題:
Q1:如果您是一個企業(yè)用戶,業(yè)務體量變大或者為了生產環(huán)境的穩(wěn)定和可用性,如何做?
A1:如上面陳述,使用函數計算和傳統(tǒng)的 PHP 開發(fā)相結合后,您再也不用考慮負載均衡的事情,不用考慮擴縮容的事情,不用管理機器、擔心宕機的事情等等,只需要安安心心把業(yè)務代碼開發(fā)好即可。
Q1:如果您是項目組開發(fā)成員比較多的企業(yè)用戶,能不能不需要給每個開發(fā)配置一個安裝的 NLP 的 Linux 機器作為開發(fā)測試機器(或者多人共享一個機器)?
A1:是的,每個開發(fā)者在函數計算上創(chuàng)建一個自己的 Service/函數即可,Service/函數配置開發(fā)測試環(huán)境的 VPC,實現內網安全訪問數據庫等其他下游服務。函數調用的時候,函數計算會拉一個 NLP 的執(zhí)行環(huán)境來運行您分支上正在開發(fā)的 PHP 代碼。
- 每個執(zhí)行環(huán)境是相互隔離的
- 按調用次數計費, 不需要預留機器, 免除了機器成本上的浪費
- 也可以很方便進行壓測等各種事宜
Q1:如果您是一個提供網站開發(fā)和托管的 ISV、外包公司或者創(chuàng)業(yè)公司,我的客戶都是一些中小企業(yè)的門戶網站,我怎么提高我后端機器資源利用率以及更好提供定制化服務?
A1:通常來說,很多企業(yè)門戶網站訪問量不大,但是網站掛掉了會引起客戶投訴。每個客戶的網站通過 service 或者函數區(qū)分,通過函數名或者 service 去區(qū)分您自己的客戶:i. 管理方便 ii. 做定制化方便 iii. 做不同 VIP 等級服務方便。舉個例子,您可以快速通過某個函數的調用指標情況,可以看出哪個客戶的網站訪問量大,可以做出客戶畫像以及制定不同的收費和 VIP 服務級別。
Q1:如果您是一個學生或者準備學習 PHP 開發(fā),本地只有 Windows 電腦,能不能直接近乎免費的方式獲取 LNP(Linux+Nginx+PHP) 的環(huán)境用來學習呢?
A1:是的, 只要將如下的文件和文件夾打包成 zip 包去函數計算控制臺創(chuàng)建函數即可:
- bootstrap - nginx.conf - php-fpm.conf - php.ini-production - myweb| - hello.php如果您對 PHP 落地 Serverless 感興趣,您有觀點、想法或者想吐槽的,可以和釘釘搜索:31897696,歡迎進群大家一起交流。
PHP 框架 Serverless 最佳實踐:
[1]ThinkPHP:
https://github.com/devsapp/start-web-framework/tree/master/web-framework/php/thinkphp/src?
[2]Laravel:
https://github.com/devsapp/start-web-framework/tree/master/web-framework/php/laravel/src?
[3]Wordpress:
https://github.com/devsapp/start-web-framework/tree/master/web-framework/php/wordpress/src?
[4]Z-BlogPHP:
https://github.com/devsapp/start-web-framework/tree/master/web-framework/php/zblog/src?
[5]Swoole:
https://github.com/devsapp/start-fc/tree/master/custom-function/php74?
[6]其他更多:
https://github.com/devsapp/start-web-framework
參考引用
Serverless Architectures:
https://martinfowler.com/articles/serverless.html?
Backend For Frontend(BFF)in Serverless:
https://www.infoq.cn/article/0btajez51ysb_qehr526?
關于 Serverless 未來對前端開發(fā)影響的具體看法:
https://developer.aliyun.com/article/793492?
當 SSR 遇上 Serverless,輕松實現頁面瞬開:
https://cnodejs.org/topic/5e394e311225c9423dcd9754?
附錄
Serverless 在前端領域如火如荼的發(fā)展
附錄1
Backend For Frontend(BFF)in Serverless 來提高生產力
? 前端開發(fā)者全棧化
? 提高開發(fā)效率,減少前端和后端接口同學的溝通聯(lián)調時間,后端同學只需要做好原子的接口的穩(wěn)定性和可靠性即可,數據的聚合直接由前端同學通過 BFF 實現
附錄2
當 SSR 遇上 Serverless,輕松實現頁面瞬開
? 借助于函數即服務(FaaS)的能力,不需要再去搭建傳統(tǒng)的 Node 應用,一個函數就可以變成一個服務,開發(fā)者可以更純粹的關注于業(yè)務邏輯。
? FaaS 以函數為單位的形式以及彈性機制,為 SSR 應用帶來了天然的隔離性和動態(tài)修復能力,可以更好的避免頁面間的交叉污染,或一些邊界的異常場景對應用帶來致命性的傷害。
? 無需運維、按需執(zhí)行、彈性伸縮這些特性,大大降低了 SSR 應用對開發(fā)者的門檻。
附錄 1:
https://www.infoq.cn/article/0btajez51ysb_qehr526?
附錄 2:
?https://cnodejs.org/topic/5e394e311225c9423dcd9754???
總結
以上是生活随笔為你收集整理的PHP 遇见 Serverless,帮你解决这些痛点的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 节省 58% IT 成本,调用函数计算超
- 下一篇: 1688 复杂业务场景下的 Server