作者:罗松(XiLiu)前言PHP的应用非常广泛,尤其是在web程序的开发方面。根据最新的维基百科[1],根据2013年4月的统计,PHP已安装在超过2.44亿个网站和210万台服务器中,而根据W3Techs[2]的报告,截至2021年9月,78.9%的网站使用PHP。所以PHP是世界排名第一的语言,至少在web开发领域不是闹着玩的。在技??术选型上,PHP主要使用LAMP(全称是Linux+apache+mysql+php)或者LNMP(全称是Linux+nginx+mysql+php)。这一成熟稳定的技术框架促进了PHPweb开发生态的繁荣和商业上的成功。传统的开发模式,需要开发者自己安装和维护各种软件的安装、维护和升级:如果你是企业用户,如果业务量变大或者为了生产环境的稳定性和可用性,不可避免地要使用loadbalancingOption:这时候php开发者或者线上运维同学比较关心的事情:每增加一台生产机需要重新安装相关软件,做同样的nginx配置和php-fpm配置,并且为每台机器维护安全更新生产机器;如果开发的应用需要新的扩展,可能需要给每台机器都加人肉;随着业务的变化,负载均衡器升级,后面的Worker机器挂了。做运维处理?如何应对业务高峰和低谷,提高资源利用率?如果你是项目组开发成员较多的企业用户,能不能每次开发都配置一台安装了NLP的Linux机器作为开发测试机(或者多人共享的机器)?如果你是ISV、外包公司或者是提供网站开发和托管的初创公司,而我的客户是一些中小企业的门户网站,我该如何提高我的后端机器的利用率资源并更好地提供定制服务?如果你是学生或者准备学习PHP开发,而你本地只有一台Windows电脑,是否可以直接以近乎免费的方式获取LNP(Linux+Nginx+PHP)环境进行学习?带着这些问题,我们来探讨一下Serverless是如何解决这些痛点的。PHP遇上无服务器什么是无服务器?Serverless=Faas(Functionasaservice)+Baas(Backendasaservice),我们简单用两张图快速理解相关概念:传统serverless图中的CDN和OSS是BaaS服务,FC是自定义功能逻辑FaaS平台,通过这样的对比,我们可以快速的了解到FaaS的特点和优势:我们只需要专注于业务代码开发,编写相应的逻辑即可实现极致弹性伸缩,无需管理服务器和按量付费,每次调用都是按毫秒计费。。。本文后面讨论的serverless主要是指FaaS,如下图示意图。写几行代码保存到云厂商的FaaS平台后,一个弹性高可用的WebAPI就完成了。PHP遇上ServerlessPHP作为开发组的大语言,各大云厂商的FaaS,如阿里云的函数计算、AWS的Lambda(通过CustomRuntime[3]间接支持)、腾讯的SCF等都推出了对PHP语言的支持,面对前端领域的Serverless技术创新实践,phper不应该放弃太多(感兴趣的可以看文末附录)。以阿里云函数计算为例,很多PHP开发者有很多有趣的做法:直接使用gd或者ImageMagick扩展实现灵活高可用的图片、水印等CPU密集型API直接使用ffmpeg+性能实例+异步有状态调用完成视频剪辑合成等音视频处理服务。广告平台嵌入HTTP触发器实现的功能,快速实现高可用的购买服务,直接基于框架(如ThinkPHP)实现WEBAPI。迁移到FaaS平台,您再也不用担心宕机和运维问题了。FaaS虽然很好的解决了phper的以下问题:在新业务或者开发新的webAPI存量业务中,一些CPU密集型或者需要高弹性的API需要单独从FaaS中抽取出来,但是传统的开发模式或者存量业务对开发者的上手和改造有一定的成本。例如某FaaS厂商PHPRuntime编程接口示例:functionhandler($event,$context){$eventObj=json_decode($event,$assoc=true);//doyourthings//....return$eventObj['key'];}但是能不能更进一步,开发者不需要按照FaaS厂商约定的函数入口一一实现API,直接可以将运行在LAMP或LNMP上的传统项目转换为FaaS?答案是肯定的。阿里云函数计算的CustomRuntime和直接基于HTTP协议的极简编程模型走在了所有云厂商的前列。函数计算在启动CustomRuntime执行环境时,会默认调用bootstrap文件(或者你创建函数时设置的Args参数)来启动你的自定义HTTPServer,然后这个HTTPServer会接管来自函数计算的所有请求system,也就是你所有的函数调用请求。函数计算自定义运行时执行环境的底层系统为Linux,内置nginx/1.10.3和php-fpm7.4。对于PHP应用,可以直接用它来部署一个wordpress[3]项目为例。只需要设置如下目录直接打包成zip包就可以在函数计算平台上创建函数了:-bootstrap-nginx.conf-php-fpm.conf-php.ini-production-wordpress其中wordpress目录是对应的web项目,bootstrap是启动nginx和php-fpm的脚本:...echo"startphp-fpm"php-fpm7.4-c/code/php.ini-production-y/code/php-fpm.confecho"startnginx"nginx-c/code/nginx.conf...bootstrap详见FC[5]中的WordPress(链接在文末)。因此,使用函数计算这种结合传统PHP开发的serverless产品后,你不再需要考虑负载均衡你不需要考虑伸缩的事情,你不需要管理机器,你不需要不用担心宕机等??,只需要安心开发业务代码即可。从上图可以看出,开发者只需要开发自己的业务代码即可。唯一需要考虑的是,函数计算的扩展不能太多太激进(比如函数如果可以直接在函数计算平台上设置弹出最大实例数就够了),并且它足以给下游的Mysql数据库造成太大的压力。当然,当从原来的传统phpweb应用完全迁移到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如虎添翼。相关链接[1]维基百科:[](https://zh.wikipedia.org/wiki...)https://zh.wikipedia.org/wiki...[2]W3Techs:[](https://w3techs.com/?)https://w3techs.com/?[3]CustomRuntime介绍:[](https://help.aliyun.com/docum...)https://help.aliyun.com/docum...[4]wordpress项目:[](https://github.com/devsapp/st...)https://github.com/devsapp/st...[5]FC中的WordPress:https://github.com/devsapp/start-web-framework/blob/master/web-framework/php/wordpress/src/code/bootstrap?最后一一回答前言中提出的问题问题:Q1:如果你是企业用户,如果你的业务量变大了,或者为了生产环境的稳定性和可用性,你应该怎么办?A1:如上所述,使用函数计算与传统PHP开发相结合后,您不再需要考虑负载均衡、扩缩容、机器管理、宕机等问题,您只需要开发业务代码即可内心的平静。Q1:如果你是企业用户,项目组开发成员较多,能不能每次开发都配置一台安装了NLP的Linux机器作为开发测试机(或者多人共享的机器)?A1:是的,每个开发者都可以在函数计算上创建自己的Service/Function。Service/Function配置开发测试环境的VPC,实现对内网数据库等下游服务的安全访问。当一个函数被调用时,函数计算会拉取一个NLP执行环境来运行你分支上正在开发的PHP代码。每个执行环境相互隔离,按调用次数计费。无需预留机器,杜绝了机器成本的浪费,也可以方便压力测试等各项事宜。Q1:如果你是做网站开发和托管的ISV、外包公司或者创业公司,我的客户是一些中小企业的门户网站,如何提高我的后台机器资源利用率并更好地提供定制服务?A1:一般来说,很多企业门户网站访问量不多,但是如果网站宕机,就会引起客户投诉。每个客户的网站以服务或功能区分,您自己的客户以功能名称或服务区分:i.易于管理ii.方便定制iii。方便提供不同的VIP等级。比如可以快速通过某个功能的调用指标,查看哪个客户的网站访问量最多,做客户画像,制定不同的收费标准和VIP服务等级。Q1:如果你是学生或准备学习PHP开发,而你本地只有一台Windows电脑,是否可以直接以近乎免费的方式获取LNP(Linux+Nginx+PHP)环境进行学习?A1:可以,将以下文件和文件夹打包成zip包,到函数计算控制台创建函数:-bootstrap-nginx.conf-php-fpm.conf-php.ini-production-myweb|-你好.php如果你对用PHP实现serverless感兴趣,有意见、想法或者想投诉可以用钉钉搜索:31897696。欢迎进群与我们交流。PHP框架Serverless最佳实践:[1]ThinkPHP:[](https://github.com/devsapp/st...)https://github.com/devsapp/st...[2]Laravel:[](https://github.com/devsapp/st...)https://github.com/devsapp/st...[3]Wordpress:[](https://github.com/devsapp/st...)https://github.com/devsapp/st...[4]Z-BlogPHP:[](https://github.com/devsapp/st...)https://github.com/devsapp/st...[5]Swoole:[](https://github.com/devsapp/st...)https://github.com/devsapp/st...[6]其他更多:[]()[https://github.com/devsapp/st...]()参考无服务器架构:[](https://martinfowler.com/arti...)https://martinfowler。com/arti...无服务器中的前端后端(BFF):[](https://www.infoq.cn/article/...)https://www.infoq.cn/article/...关于Serverless对未来前端开发影响的具体看法:[](https://developer.aliyun.com/...)https://developer.aliyun.com/...当SSR遇上Serverless,轻松实现页面即时打开:[](https://cnodejs.org/topic/5e3...)https://cnodejs.org/topic/5e3...附录Serverless发展如火如荼前端领域附录一BackendForFrontend(BFF)inServerless提高生产力?面向前端开发人员的全栈?提高开发效率,减少前后端接口同学的沟通和联调时间,后端同学只需要做好原子接口的稳定性和可靠性,直接实现数据聚合前端同学通过BFF附录2当SSR遇上Serverless,轻松实现页面即时打开?借助Functionasaservice(FaaS),无需构建传统的Node应用,一个功能即可变成一个服务,开发者可以更纯粹地专注于业务逻辑?FaaS以函数为单位的形式和弹性机制为SSR应用带来天然的隔离和动态修复能力,可以更好地避免页面之间的交叉污染,或者对应用的致命伤害由一些边界异常场景引起。?免运维、按需执行、弹性伸缩等特性大大降低了SSR应用的开发者门槛。附录一:[](https://www.infoq.cn/article/...)https://www.infoq.cn/article/...附录二:https://cnodejs.org/topic/5e394e311225c9423dcd9754?
