PHP 的應用範圍相當廣泛,尤其是在網頁程式的開發上, 根據最新維基百科 顯示,2013年4月的統計資料,PHP已經被安裝在超過2億4400萬個網站和210萬台伺服器上, 而根據W3Techs 的報告,截至2021年9月, 有78.9%的網站使用PHP。所以 PHP 是世界第一語言至少在 web 開發領域並不是戲稱。
而在技術選型上, PHP 主要採用的是LAMP(全名是Linux apache mysql php) 或LNMP(全名為Linux nginx mysql php), 這種成熟穩定的技術框架推動PHP web 開發生態的繁榮和商業上的成功。
在傳統的開發模式中, 開發者自己需要安裝維護各種軟體的安裝、維護升級:
如果您是企業用戶, 如果業務體積變大或為了生產環境的穩定和可用性, 使用負載平衡是一個必然的選項:
即此時, PHP 開發者或線上運維的同學關心的事情多了起來:
每個增加的生產機器都需要重新安裝一遍相關軟體, 做相同的nginx 配置以及php-fpm 的配置, 以及維護每個生產機器的安全更新
假如開發的應用需要一個新的擴展, 可能需要人肉每台機器去增加擴充功能
負載平衡器隨著業務的變更升配, 後面一台Worker 機器掛掉了, 如何做運維處理
業務的波峰波谷怎麼應對才能讓資源的利用率提高
...
如果您是學生或準備學習 PHP 開發,本地只有 Windows 電腦, 能不能直接近乎免費的方式取得 LNP(Linux Nginx PHP) 的環境用來學習呢?
...Serverless = Faas (Function as a service) Baas (Backend as a service), 我們簡單透過兩張圖表快速了解相關概念:
#Serverless 模式
極致彈性伸縮,無需管理伺服器
#########按量付費,每次呼叫毫秒計費############...#############本文後續討論的Serverless 主要指的是FaaS, 如下示意圖, 幾行程式碼寫完畢, 儲存到雲端廠商的FaaS 平台, 就完成了一個彈性高可用的Web API。 ###### ######PHP 作為一個開發群體的很大的語言, 各大雲廠商的FaaS,比如阿里雲的函數計算、AWS 的Lambda (通過Custom Runtime間接支持)、 騰訊的SCF 等都推出了對PHP 語言的支持, phper 面對前端領域的Serverless 技術革新實踐(感興趣的見本文最後的附錄), 應該不遑多讓。以阿里雲函數運算為例, 有許多PHP 的開發者有了很多有趣的實踐:
直接使用gd 或ImageMagick 擴展, 實現彈性高可用的圖片、水印等各種CPU 密集型API
直接使用ffmpeg 性能型實例非同步有狀態呼叫完成視訊剪輯合成等音視訊處理業務
使用HTTP觸發器實現的函數, 埋點到廣告平台, 快速實現高可用的買量業務
直接將先前基於框架(如ThinkPHP)實現的WEB API 直接遷移到FaaS 平台,不用再擔心宕機和運維問題了
...
#雖然FaaS 很好地解決了 phper 如下問題:
新業務或開發新的web API
存量業務中, 有些CPU 密集或彈性要求很高的API 會單獨抽離出來FaaS 化
但是傳統的開發模式或存量業務,對開發者有一定的上手和改造成本,例如某Faas 廠商PHP Runtime 程式介面範例:
function handler($event, $context) { $eventObj = json_decode($event, $assoc = true); // do your thhings // .... return $eventObj['key']; }
但能不能更進一步, 開發者不需要依照FaaS 廠商的約定的函數入口能實現一個個的API, 而是能直接將傳統運作在LAMP 或LNMP 的專案直接FaaS 化?
答案是肯定的
阿里雲函數計算的 Custom Runtime 以及直接基於 HTTP 協定的極簡程式設計模型走在了所有雲端廠商的前列。
函數計算啟動Custom Runtime執行環境時,會預設呼叫bootstrap檔案(或您建立函數的時設定的Args參數)啟動您自訂的HTTP Server, 然後這個HTTP Server接管了函數計算系統的所有請求,也就是您所有的函數呼叫請求。
函數計算Custom runtime 執行環境底層系統是Linux, 並且已經內建的nginx/1.10.3 和php-fpm7.4, 對於PHP 應用,您直接使用即可
以部署一個wordpress 專案 為例, 只需要將如下目錄直接打包成一個zip 套件在函數計算平台創建一個函數即可:
- 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
所以, 使用函數計算這個Serverless 產品和傳統的PHP 開發相結合後, 您再也不用考慮負載平衡的事情, 不用考慮擴縮容的事情, 不用管理機器、不用擔心宕機的事情等等, 只需要安安心心把業務代碼開發好即可。
從上圖可以看出:開發者只需要開發好自己的業務程式碼即可,唯一需要考慮的事情, 就是函數計算這邊擴容不要太多太猛(例如直接在函數計算平台設定下函數能彈出的最大實例數目即可), 給下游自己的Mysql 資料庫過大的壓力即可。
當然, 從原始的傳統的php web 應用完全遷移到Serverless 形態的函數計算平台, 某些場景可能需要考慮資料持久化問題, 因為函數計算是無狀態的, 資料持久化保存可藉助NAS、Redis 等服務完成,以NAS 為例,流程圖如下:
以WordPress 為例, 後台系統上傳的圖片或Session 功能都是需要持久化到磁碟的。
設定web 工程的檔案上傳目錄或session 目錄為NAS 碟的某個目錄, NAS 磁碟實現持久化
甚至可以將web 工程直接放到NAS 盤上, 此時函數計算純粹就是LNP 執行環境
#
比如将 wordpress 工程不作为函数的代码包的一部分, 而已提前上传到 NAS 盘, 只需要设置好 nginx.conf 中的 root 能知道 web 工程即可, 如上面的 nginx.conf, /mnt/auto 表示挂载的 NAS 目录,mnt/auto/wordpress 则表示在 NAS 上的 web 工程。
此时对您来说, 函数再也不用变了, 您可能只是需要开发新的业务代码, 然后上传到 NAS 上即可(或者直接使用 git 直接在 NAS 操作,实现 web 工程的版本和 git 上的 commit 绑定, 使用 git 实现代码的快速升级和混滚)
但是从安全生产的角度来说, 还是建议您 web 工程变更最好和函数的变更相关联
小结
从上面的讨论和陈述中, 我们不难发现, PHP 遇见 Serverless 是一件令人兴奋的事情, 让 phper 有了更大的想象空间。 Serverless 的理念和 PHP 这个语言出现的理念也是一致的: 即让开发者最大精力集中在自己的业务价值。 PHP 语言一直是 web 领域最好的生产力代表, 而 Serverless 将会让 PHP 如虎添翼。
我们最后来一一解答下前言中提出的问题:
如果您是一个企业用户, 业务体量变大或者为了生产环境的稳定和可用性, 如何做?
如上面陈述, 使用函数计算和传统的 PHP 开发相结合后, 您再也不用考虑负载均衡的事情, 不用考虑扩缩容的事情, 不用管理机器、担心宕机的事情等等, 只需要安安心心把业务代码开发好即可。
如果您是项目组开发成员比较多的企业用户,能不能不需要给每个开发配置一个安装的 NLP 的 Linux 机器作为开发测试机器(或者多人共享一个机器)?
是的, 每个开发者在函数计算上创建一个自己的 Service/函数即可, Service/函数配置开发测试环境的 VPC,实现内网安全访问数据库等其他下游服务。 函数调用的时候, 函数计算会拉一个 NLP 的执行环境来运行您分支上正在开发的 PHP 代码。
每个执行环境是相互隔离的
按调用次数计费, 不需要预留机器, 免除了机器成本上的浪费
也可以很方便进行压测等各种事宜
如果您是一个提供网站开发和托管的 ISV 、外包公司或者创业公司, 我的客户都是一些中小企业的门户网站, 我怎么提高我后端机器资源利用率以及更好提供定制化服务?
通常来说, 很多企业门户网站访问量不大, 但是网站挂掉了会引起客户投诉。每个客户的网站通过service 或者函数区分, 通过函数名或者service去区分您自己的客户: i. 管理方便 ii. 做定制化方便 iii. 做不同vip等级服务方便。 举个例子, 您可以快速通过某个函数的调用指标情况, 可以看出哪个客户的网站访问量大,可以做出客户画像以及制定不同的收费和 vip 服务级别。
如果您是一个学生或者准备学习 PHP 开发,本地只有 Windows 电脑, 能不能直接近乎免费的方式获取 LNP(Linux+Nginx+PHP) 的环境用来学习呢?
是的, 只要将如下的文件和文件夹打包成 zip 包去函数计算控制台创建函数即可
- bootstrap - nginx.conf - php-fpm.conf - php.ini-production - myweb | - hello.php
这里构建了一个钉钉群: 31897696, 如果您对 PHP 落地 Serverless 感兴趣,您有观点、想法或者想吐槽的, 可以和大家一起交流。
本文作者:罗松(西流)
阿里云函数计算技术专家
负责阿里云函数计算产品功能开发(runtime 开发、事件源集成以及企业级 Serverless 解决方案落地等),目前专注在 Serverless 开发者工具链的建设,是云原生 Serverless Dev Tools 研发负责人,主导了 S/fc 等组件的开发工作,关注 Serverless 最新技术动态以及企业级解决方案的落地,致力于推动 Serverless 在开发者群体的流行。
以上是PHP遇見Serverless,幫你解決這些痛點!的詳細內容。更多資訊請關注PHP中文網其他相關文章!