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

开发函数计算的正确姿势——为PHP运行时添加自定义扩展

时间:2023-03-29 20:19:58 PHP

PHP语言提供了一种扩展机制(Extension),通过PHP扩展可以增强语法,调用C/C++实现的库函数,优化执行性能。PHP扩展是平台相关的动态链接库,在Linux和Mac平台上是.so文件,在Windows平台上是.dll文件。由于函数计算通常在Mac和Windows平台上开发,运行时是Linux(Debain)环境,所以在函数计算的PHP运行时添加扩展会遇到平台相关动态链接库导致本地调试失败,或者远程不工作的问题。本文介绍借助Funcraft工具提供的模拟环境安装PHP扩展、本地运行调试、构建发布。准备工作依赖于工具本项目是在MacOS下开发的,所涉及的工具是平台无关的,应该同样适用于Linux和Windows桌面系统。在开始本示例之前,请确保以下工具已正确安装、更新到最新版本并正确配置。DockerFunFun和Fcli工具依赖于docker来模拟本地环境。MacOS用户可以使用homebrew安装:brewcaskinstalldockerbrewtapvangie/formulabrewinstallfunbrewinstallfcliWindows和Linux用户请参考:https://github.com/aliyun/fun/blob/master/docs/使用/安装。mdhttps://github.com/aliyun/fcli/releases安装完成后记得执行funconfig初始化配置。注意,如果安装了fun,请确保fun的版本在3.6.1以上。$fun--version3.6.1PHP自定义扩展在函数代码目录下创建名为extension的目录,将扩展对应的.ini和.so文件放在扩展目录下。例如下面是hello的自定义扩展,假设扩展中有一个hello_world函数:.|____extension||____你好.ini||____hello.so|____main.phphello.iniextension=/code/extension/hello.somain.php/code/extension/mongodb.ini逐行解释上面五行第一行首先声明它是一个php7.2版本的Runtime,然后安装构建mongodb所需要的依赖。这里主要是安装openssl,目的是让mongodb扩展库支持ssl,解决连接时出错的问题。通过pecl下载、构建和安装mongodb扩展。将mongodbextension复制到/code/extendsion目录下,该目录为函数计算约定的扩展目录,生成mongodb.int文件。这里的文件名任意,只需要以.ini结尾即可。然后执行funinstall-fphpusingtemplate:template.yml...InstallSuccess安装成功后会有一个extension目录,里面有mongodb.so和mongodb.ini文件╰─?tree.├──Funfile├──extension│├──mongodb.ini│└──mongodb.so├──index.php└──template.ymlinstallmongodbdependency执行以下命令通过composer安装依赖'mongodb/mongodb'$funinstallsbox-ffc-mongodb-c"composerrequiremongodb/mongodb"使用模板:template.ymlskippullingimagealiyunfc/runtime-php7.2:build-1.9.0...Usingversion^1.6formongodb/mongodb./composer.jsonhasbeencreatedLoadingcomposerrepositorieswithpackageinformationUpdatingdependencies(includingrequire-dev)Packageoperations:1install,0updates,0removals-Installingmongodb/mongodb(1.6.0):Downloading(100%)写锁文件生成自动加载文件安装成功后,会有代码目录下多处composer.json文件、composer.lock文件和vend或者目录╰─?tree-L2.├──Funfile├──composer.json├──composer.lock├──extension│├──mongodb.ini│└──mongodb.so├──index.php├──template.yml└──vendor├──autoload.php├──composer└──mongodb本地调试更新index.php文件$db_name->fc_col;$result=$collection->insertOne(['DEMO'=>'FC','MSG'=>'HelloFunctionComputeForMongoDB']);echo"插入对象ID'{$result->getInsertedId()}'","\n";$cursor=$collection->find(['DEMO'=>'FC']);$结果='';foreach($cursoras$entry){echojson_encode($entry->getArrayCopy()),"\n";}$result=$result.json_encode($entry->getArrayCopy())。"\n";}return$result;}使用docker启动一个临时的mongodb数据库dockerrun--rm--namemongo_for_fc\-eMONGO_INITDB_ROOT_USERNAME=mongoadmin\-eMONGO_INITDB_ROOT_PASSWORD=secret\-p27017:27017\mongo更新template.yml文件,添加莫NGO_DATABASE和MONGO_URL环境变量ROSTemplateFormatVersion:'2015-09-01'Transform:'Aliyun::Serverless-2018-04-03'Resources:fc-mongodb:Type:'Aliyun::Serverless::Service'Properties:Description:'helloworld'fc-mongodb:类型:'Aliyun::Serverless::Function'属性:处理器:index.handler运行时:php7.2CodeUri:'./'环境变量:MONGO_DATABASE:adminMONGO_URL:mongodb://mongoadmin:secret@host.docker.internal:27017/admin使用funlocal本地模拟运行$funlocalinvokeusingtemplate:template.ymlMissinginvokeNameargument,Fun将使用第一个函数fc-mongodb/fc-mongodbasinvokeNameskippullingimagealiyunfc/runtime-php7.2:1.9.2...FunctionComputephp7.2runtimeinited.FCInvokeStartRequestId:b1764771-896b-4c27-9ad8-6c325cc3d749InsertedwithObjectID'5e539d08c42dc23cf23863e2'{"_id":{"$oid":"5e539d08c42dc23"cf2:"DE2863""FC","MSG":"HelloFunctionComputeForMongoDB"}FC调用结束RequestId:b1764771-896b-4c27-9ad8-6c325cc3d749{"_id":{"$oid":"5e539d08c42dc23cf23863e2"},"DEMO":"FC","MSG":"HelloFunctionComputeForMongoDB"}RequestId:b1764771-896b-4c27-9ad8-6c325cc3d749BilledDuration:214msMemorySize:1989MBMaxMemoryUsed:27MB如果你想用本地断点调试,你可以使用AliyunServerlessVSCodeExtension,如下图发布和调用,请设置MONGO_DATABASEintemplate.yml配置文件更新MONGO_URL环境变量为你线上系统对应的配置,然后发布$fundeployusingtemplate:template.ymlusingregion:cn-shanghaiusingaccountId:*************4733usingaccessKeyId:***********EUz3usingtimeout:60正在收集你的服务信息,以计算开发变化...资源变化(测试版!只显示FC资源变化):┌────────────────┬─────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐│资源│资源类型│动作│属性│├────────────────┼────────────────────────────────┼────────────────────────────────────────────────────────────────────────────────────┤│fc-mongodb│阿里云::S无服务器::服务│修改│描述│├────────────┼──────────────────────────────┼────────┼────────────────────┤││││处理程序││││├──────────────────────┤││││运行时││fc-mongodb│Aliyun::Serverless::Function│修改├──────────────────────┤││││CodeUri││││├──────────────────────┤││││环境变量│└────────────┴──────────────────────────────┴──────────┴──────────────────────┘?请确认以继续。是Waitingforservicefc-mongodbtobedeployed...Waitingforfunctionfc-mongodbtobedeployed...Waitingforpackagingfunctionfc-mongodbcode...fc-mongodb功能已经打包。一共压缩了761个files文件,最终大小为2.81MBfunctionfc-mongodbdeploysuccessservicefc-mongodbdeploysuccess大多数使用funinvoke命令验证调用install和funlocalinvoke的结果,用于PHP项目开发调试带扩展名。Funfile文件可以描述扩展的安装命令。如果你有使用Dockerfile的经验,你会发现两者的使用体验非常相似。这里虽然只举了一个mongodb的例子,但是这个例子比较完整,同样适用于其他需要安装PHP扩展的类似场景。参考阅读Funcraftfc-db开源项目Funfile函数介绍函数计算-PHP运行环境-自定义扩展加入我们的团队介绍阿里云函数服务是一种全新的计算服务,支持事件驱动编程模式。它帮助用户专注于自己的业务逻辑,以Serverless的方式构建应用,快速实现低成本、可扩展、高可用的系统,而无需考虑服务器等底层基础设施的管理。用户可以快速创建原型,相同的架构可以随着业务规模平滑扩展。让计算更高效、更经济、更灵活、更可靠。无论是小型初创公司还是大型企业都从中受益。我们的团队正在迅速扩大,我们正在寻找有才华的人。我们要找这样的队友:基本功扎实。不仅可以看论文跟踪行业动态,还可以快速编码解决实际问题。严谨、系统的思维能力。不仅可以统筹考虑商机、系统架构、运维成本等诸多因素,还可以控制设计/开发/测试/发布的全过程,预测和控制风险。在好奇心和使命感的驱使下。乐于探索未知领域,不仅是梦想家,更是实践者。坚韧、乐观、自信。能在压力和困难中看到机遇,让工作充满乐趣!如果您对云计算充满热情,想打造具有影响力的计算平台和生态,请加入我们,与我们一起实现您的梦想!职位描述构建新一代Serverless计算平台,包括:设计并实现一个完整的、可扩展的前端系统,包括认证/权限管理、元数据管理、流量控制、计量计费、日志监控等。设计并实现一个灵活可靠的后台系统,包括资源调度、负载均衡、容错处理等丰富易用的SDK/Tools/CLI/Console以用户需求为驱动,跟踪行业趋势,用技术推动业务增长该职位需要扎实的算法/数据结构/操作系统基础知识和出色的逻辑思维能力。至少掌握一门编程语言。例如Java/Go/C/C#/C++。有开发大规模、高可用分布式系统经验者优先。有Web/移动后端/微服务开发经验者优先。良好的沟通能力和团队合作精神,具有一定的组织协调能力。本科及以上学历,3年以上工作经验,通过《阿里巴巴编码规范》认证者优先。com》阿里云原生技术圈聚焦微服务、Serverless、容器、ServiceMesh等技术领域,关注流行的云原生技术趋势,以及云原生技术的大规模落地。是一个技术圈,最了解云原生开发人员。”