PHP 遇见 Serverless,帮你解决这些痛点!
共 6563字,需浏览 14分钟
·
2022-01-23 05:01
前言
每个增加的生产机器都需要重新安装一遍相关软件,做相同的 nginx 配置以及 php-fpm 的配置, 以及维护每个生产机器的安全更新;
假如开发的应用需要一个新的扩展,可能需要人肉每台机器去增加扩展;
负载均衡器随着业务的变更升配,后面一台 Worker 机器挂掉了, 如何做运维处理?
业务的波峰波谷怎么应对才能让资源的利用率提高?
PHP 遇见 Serverless
什么是 Serverless
传统模式
Serverless 模式
只需要专注业务代码开发, 编写对应的逻辑即可 极致弹性伸缩, 无需管理服务器 按量付费,每次调用按毫秒计费 ...
PHP 遇见 Serverless
直接使用 gd 或者 ImageMagick 扩展, 实现弹性高可用的图片、水印等各种 CPU 密集型 API
直接使用 ffmpeg + 性能型实例 + 异步有状态调用完成视频剪辑合成等音视频处理业务
使用 HTTP 触发器实现的函数, 埋点到广告平台, 快速实现高可用的买量业务
直接将之前基于框架(如 ThinkPHP)实现的 WEB API 直接迁移到 FaaS 平台,不用再担心宕机和运维问题了
新业务或者开发新的 web API 存量业务中, 有些 CPU 密集型或者弹性要求很高的 API 单独抽离出来 FaaS 化
function handler($event, $context) {
$eventObj = json_decode($event, $assoc = true);
// do your thhings
// ....
return $eventObj['key'];
}
函数计算 Custom runtime 执行环境底层系统是 Linux,并且已经内置的 nginx/1.10.3 和 php-fpm7.4, 对于 PHP 应用,您直接使用即可
- bootstrap
- nginx.conf
- php-fpm.conf
- php.ini-production
- wordpress
...
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(文末附链接)
设置 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 工程变更最好和函数的变更相关联。
小结
文中涉及链接汇总(可滑动)
维基百科:https://zh.wikipedia.org/wiki/PHP?
W3Techs:https://w3techs.com/?
Custom Runtime简介:https://help.aliyun.com/document_detail/132044.html?
wordpress 项目:https://github.com/devsapp/start-web-framework/tree/master/web-framework/php/wordpress/src?
WordPress in FC:https://github.com/devsapp/start-web-framework/blob/master/web-framework/php/wordpress/src/code/bootstrap?
我们最后来回答下前言中提出的问题:
Q1:如果您是一个企业用户,业务体量变大或者为了生产环境的稳定和可用性,如何做?
Q2:如果您是项目组开发成员比较多的企业用户,能不能不需要给每个开发配置一个安装的 NLP 的 Linux 机器作为开发测试机器(或者多人共享一个机器)?
每个执行环境是相互隔离的 按调用次数计费, 不需要预留机器, 免除了机器成本上的浪费 也可以很方便进行压测等各种事宜
Q3:如果您是一个提供网站开发和托管的 ISV、外包公司或者创业公司,我的客户都是一些中小企业的门户网站,我怎么提高我后端机器资源利用率以及更好提供定制化服务?
Q4:如果您是一个学生或者准备学习 PHP 开发,本地只有 Windows 电脑, 能不能直接近乎免费的方式获取 LNP (Linux+Nginx+PHP) 的环境用来学习呢?
- bootstrap
- nginx.conf
- php-fpm.conf
- php.ini-production
- myweb
| - hello.php
END
PHP 框架 Serverless 最佳实践:
ThinkPHP:https://github.com/devsapp/start-web-framework/tree/master/web-framework/php/thinkphp/src?
Laravel:https://github.com/devsapp/start-web-framework/tree/master/web-framework/php/laravel/src?
Wordpress:https://github.com/devsapp/start-web-framework/tree/master/web-framework/php/wordpress/src?
Z-BlogPHP:https://github.com/devsapp/start-web-framework/tree/master/web-framework/php/zblog/src?
Swoole:https://github.com/devsapp/start-fc/tree/master/custom-function/php74?
其他更多: 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 未来对前端开发影响的具体看法:https://developer.aliyun.com/article/793492?
当 SSR 遇上 Serverless,轻松实现页面瞬开:https://cnodejs.org/topic/5e394e311225c9423dcd9754?
附录:
前端开发者全栈化
提高开发效率,减少前端和后端接口同学的沟通联调时间, 后端同学只需要做好原子的接口的稳定性和可靠性即可, 数据的聚合直接由前端同学通过 BFF 实现
借助于函数即服务(FaaS)的能力,不需要再去搭建传统的 Node 应用,一个函数就可以变成一个服务,开发者可以更纯粹的关注于业务逻辑。
FaaS 以函数为单位的形式以及弹性机制,为 SSR 应用带来了天然的隔离性和动态修复能力,可以更好的避免页面间的交叉污染,或一些边界的异常场景对应用带来致命性的伤害。
无需运维、按需执行、弹性伸缩这些特性,大大降低了 SSR 应用对开发者的门槛。
附录1:https://www.infoq.cn/article/0btajez51ysb_qehr526?
附录2:https://cnodejs.org/topic/5e394e311225c9423dcd9754?
奖励看到最后的你:
# 点个在看,并在下方留言互动
# 然后,将截图发送至后台,试试手气?
# 本周互动奖品是“阿里云定制数据线”
# 本期礼品开奖时间1月25日