当前位置: 首页 > 后端技术 > PHP

十分钟上线——函数计算玩转WordPress

时间:2023-03-30 02:44:18 PHP

摘要:众所周知,PHP是Web编程最流行的编程语言。如果有人告诉你,有一种新的ServerlessPHPWEB开发模式,你会不会感到好奇和兴奋?本文以在函数计算环境部署WordPress项目为例,讲解如何使用阿里云函数计算快速搭建或迁移基于PHP框架开发的Web,体验ServerlessWeb开发的新姿态。前言本文适合所有PHP开发新手、老手以及想学习PHP开发的程序员。众所周知,PHP是最流行的Web编程语言。如果有人告诉你,有一种新的ServerlessPHPWEB开发模式,你会不会感到好奇和兴奋?在介绍新的serverlessweb开发模式之前,我们先来了解一下让PHPwebserverless的好处:无需购买和管理服务器等基础设施,弹性伸缩,无需运维动态扩展,大大降低人力成本,按需付费,财务成本低本文以在函数计算环境中部署WordPress项目为例,向大家讲解如何使用阿里云函数计算快速搭建或移植基于PHP框架开发的Web。通过本文,您将了解以下内容:案例总览传统服务器架构VSServerless架构Serverless架构详解函数计算运行PHP框架原理案例开发配置步骤FCWeb设置自定义域名案例总览在本教程中,我们将讲解如何使用Function一步步计算搭建一个Web服务器。本案例是将一个WordPress部署到函数计算上,本文旨在展示函数计算作为WebBackend的能力,具体如下:将一个完整的PHP系统迁移到FC上的成本并不高。FC开放了私网VPC功能,用户功能可以配置访问私网。云资源,如本案例中的MYSQL,NAS案例体验入口:体验地址:http://1986114430573743.cn-ha...账号:wp-test密码:wp-pwd传统服务器架构VSServerless架构正常情况下,当用户开发服务端服务,往往面临开发效率高、运维成本高、机器资源弹性伸缩等痛点。Serverless架构可以很好的解决上述问题。下面是传统架构和Serverless架构的对比:阿里云函数计算是一个事件驱动的全托管计算服务。使用函数计算,您无需管理服务器等基础设施,只需编写代码并上传即可。函数计算将为您准备好计算资源,弹性可靠地运行您的代码,并提供日志查询、性能监控、告警等功能。通过函数计算,您可以快速构建任意类型的应用和服务,无需管理和运维。Serverless架构详解从上面的示例图来看,整体架构非常简单明了,用FC代替了web服务器,但是换来了免费运维、灵活扩展、按需付费等一系列优势。you-go等函数计算运行PHP框架原理传统服务器PHP运行原理示意图一个简单的nginxconf从上面的示意图可以看出,Web服务器将PHP脚本发送给php-fpm进行解析在conf中定位,然后返回解析结果给客户端FC驱动PHP工程原理函数计算的执行环境相当于传统web服务的Apache/Nginx用户函数。功能相当于在Apache/Nginx的conf中实现locationuser。用户将网站部署在NAS上,然后将NAS挂载到函数的执行环境,比如下面代码中的/mnt/www目录,对于WordPress入口函数代码来说就这么简单。建议先了解PHPRuntimePHP入口函数PHP执行环境返回(substr($haystack,0,$length)===$needle);}函数处理程序($request,$context):Response{$uri=$request->getAttribute("requestURI");$uriArr=explode("?",$uri);//默认php/或/wp-admin/if(preg_match('#/$#',$uriArr[0])&&!(strpos($uri,'.php'))){$uriArr[0].="index.php";$uri=内爆($uriArr);如果(startsWith($uri,"/2016-08-15/proxy/share/wp-func/wp-admin/")){//wordpress管理入口点$request=$request->withAttribute("requestURI",$uri);}}$proxy=$GLOBALS['fcPhpCgiProxy'];$root_dir='/mnt/www';//php脚本if(preg_match('#\.php.*#',$uri)){$format='%s.%s.fc.aliyuncs.com';$host=sprintf($format,$context['accountId'],$context['region']);//也许用户定义域$resp=$proxy->requestPhpCgi($request,$root_dir,"index.php",['SERVER_NAME'=>$host,'SERVER_PORT'=>'80','HTTP_HOST'=>$host],['debug_show_cgi_params'=>false,'readWriteTimeout'=>15000]);return$resp;}else{//静态文件,js,css,jpg...$filename=$root_dir.explode("?",$uri)[0];$handle=fopen($filename,"r");$contents=fread($handle,filesize($filename));fclose($handle);$headers=['Content-Type'=>$proxy->getMimeType($filename),'Cache-Control'=>"max-age=8640000",'Accept-Ranges'=>'bytes',];返回新的响应(200,$headers,$contents);其中,函数计算为用户提供了一个$GLOBALS['fcPhpCgiProxy']对象来与php-fpm进行交互,解析PHP项目中的php文件。这个对象提供了两个重要的接口:requestPhpCgirequestPhpCgi($request,$docRoot,$phpFile="index.php",$fastCgiParams=[],$options=[])$request:与phphttp调用入口的参数一致$docRoot:Web项目根目录$phpFile:用于拼接cgi参数中SCRIPT_FILENAME的默认参数$fastCgiParams:函数计算内部会根据$request为你构造默认的cgi参数,但如果你不想它,可以使用$fastCgiParams覆盖一些参数(参考:cgi)$options:数组类型,可选参数,debug_show_cgi_params设置为true,每次解析php时都会打印cgi参数,默认为false;readWriteTimeout设置解析时间,默认5秒案例开发配置步骤preparationWork由于函数运行时IP不固定,所以需要设置RDS允许所有IP访问,但是这样会有风险,也不是建议这样做。在本教程中,我们将创建一个RDSMYSQL数据库并将其放置在VPC环境中。函数计算支持VPC功能,用户可以通过授权的方式安全地访问VPC中的资源(本例中也包括NAS)。创建RDSMYSQL数据库,配置VPC,参考通过VPC访问RDS实例创建NAS挂载点,配置VPC(注意:这里和RDS使用同一个VPC),具体参考函数calculationnasusageexample可选操作,在准备函数的区域创建函数调试日志。具体参考FunctionComputeConfigurationLogServiceCreateafunction创建一个Service(假设是share),配置准备vpcconfig、nasconfig和logservice。例如案例体验的Service配置如下:下载WordPress,然后将WordPress项目移动到上面配置的NAS中,www表示WordPress项目根目录|--index.py|--wwwindex.py代码:#-*-编码:utf-8-*-导入日志导入osfile="/mnt/www/2016-08-15/proxy/share/wp-func"defmkdir(path):folder=os.path.exists(path)如果不是文件夹:os.makedirs(path)deflsDir():os.system("ls-ll/mnt/www/2016-08-15/proxy/share/wp-func/")def处理程序(事件,上下文):mkdir(文件)os.system(“cp-r/code/www/*/mnt/www/2016-08-15/proxy/share/wp-func/”)打印(lsDir())return'ok'根据以上代码创建函数move-wp-nas并执行Function将WordPress项目包移动到/mnt/www/2016-08-15/proxy/share/wp-func目录下NAS。Q1:为什么要创建/2016-08-15/proxy/share/wp-func这样奇怪的目录?A:因为http触发,函数访问的格式为如下url:http://${account_id}.${region}.fc.aliyuncs.com/2016-08-15/proxy/$(seevice_name}/{function_name}/,为了保证在页面跳转时能够自动带上/2016-08-15/proxy/$(seevice_name}/{function_name}/,我们需要创建这样一个目录,并设置cgi相关参数达到PHP框架内部自动正确跳转的问题Q2:/2016-08-15/proxy/share/wp-func这样奇怪的目录可以不使用吗?A:可以的函数在线计算自定义域名函数时解决了这个问题,具体操作会在后面的文章更新创建入口函数wp-func(对应/mnt/www/2016-08-15/proxy/share/wp-func),并为函数设置http触发器,类型为匿名,选择所有类型。getAttribute("requestURI");$uriArr=explode("?",$uri);//默认php/或/wp-admin/if(preg_match('#/$#',$uriArr[0])&&!(strpos($uri,'.php'))){$uriArr[0].="index.php";$uri=内爆($uriArr);if(startsWith($uri,"/2016-08-15/proxy/share/wp-func/wp-admin/")){//wordpress管理入口点$request=$request->withAttribute("requestURI",$乌里);}}$proxy=$GLOBALS['fcPhpCgiProxy'];$root_dir='/mnt/www';//php脚本if(preg_match('#\.php.*#',$uri)){$format='%s.%s.fc.aliyuncs.com';$host=sprintf($format,$context['accountId'],$context['地区']);//也许用户定义域$resp=$proxy->requestPhpCgi($request,$root_dir,"index.php",['SERVER_NAME'=>$host,'SERVER_PORT'=>'80','HTTP_HOST'=>$host],['debug_show_cgi_params'=>false,'readWriteTimeout'=>15000]);返回$resp;}else{//静态文件,js,css,jpg...$filename=$root_dir.爆炸(“?”,$uri)[0];$handle=fopen($文件名,"r");$contents=fread($handle,filesize($filename));fclose($句柄);$headers=['Content-Type'=>$proxy->getMimeType($filename),'Cache-Control'=>"max-age=8640000",'Accept-Ranges'=>'bytes',];返回新的响应(200,$headers,$contents);直接通过url访问首页,第一次访问会提示安装WordPress,配置数据库,管理员等安装过程前准备的相关信息,安装成功后,即可成功访问首页并登录在后台管理WordPress网站http://${account_id}.${region}.fc.aliyuncs.com/2016-08-15/proxy/$(seevice_name}/{function_name}/例如:http://1986114430573743.cn-hangzhou.fc.aliyuncs.com/2016-08-15/proxy/share/wp-func/FCWeb设置自定义域名待更新...总结函数计算具有以下优势:无需购买和管理服务器等基础设施即可专注于业务逻辑开发,提供日志查询、性能监控、告警等功能,快速排查故障,以事件驱动的方式触发应用响应用户请求,毫秒级弹性伸缩,快速实现底层扩展,应对高峰压力,按需付费,只需要为实际的计算资源付费付费,适用于用户访问峰谷明显的场景除了上面列举的优势,FC还可以作为WebBackend,你只需要写实现传统Webser中conf中逻辑的函数ver,可以将一个完整的Web项目迁移到FC上,从而从传统网站运维、监控等繁琐工作中解脱出来。本文作者:rsong阅读原文内容原文云栖社区,未经许可不得转载。