开发事件函数
函数定义
PHP 7.3函数的接口定义如下所示:
function handler($event, $context)
- 入口函数名($handler):入口函数名称, 需和函数执行入口处用户自定义的入口函数名称一致。
- 执行事件($event):函数执行界面由用户输入的执行事件参数, 格式为JSON对象。
- 上下文环境($context):Runtime提供的函数执行上下文,其接口定义在SDK接口说明。
- 函数执行入口: index.handler。
- 函数执行入口格式为“[文件名].[函数名]”。例如创建函数时设置为index.handler,那么FunctionGraph会去加载index.php中定义的handler函数。
PHP的initializer入口介绍
函数服务目前支持以下PHP运行环境。
- Php 7.3 (runtime = Php7.3)
Initializer格式为:
[文件名].[initializer名]
示例:创建函数时指定的initializer为main.my_initializer,那么FunctionGraph会去加载main.php中定义的my_initializer函数。
在函数服务中使用PHP实现initializer接口,需要定义一个PHP函数作为initializer入口,一个最简单的initializer示例如下。
<?php Function my_initializer($context) { echo 'hello world' . PHP_EOL; } ?>
- 函数名
my_initializer需要与实现initializer接口时的initializer字段相对应。
示例:实现initializer接口时指定的Initializer入口为main.my_initializer,那么FunctionGraph会去加载main.php中定义的my_initializer函数。
- context参数
context参数中包含一些函数的运行时信息,例如:request id、临时AccessKey、function meta等。
SDK接口
Context类中提供了许多上下文方法供用户使用,其声明和功能如所示。
方法名 |
方法说明 |
---|---|
getRequestID() |
获取请求ID。 |
getRemainingTimeInMilliSeconds () |
获取函数剩余运行时间。 |
getAccessKey() |
获取用户委托的AccessKey(有效期24小时),使用该方法需要给函数配置委托。
说明:
当前函数工作流已停止维护Runtime SDK 中getAccessKey接口,您将无法使用getAccessKey获取临时AK。 |
getSecretKey() |
获取用户委托的SecretKey(有效期24小时),使用该方法需要给函数配置委托。
说明:
当前函数工作流已停止维护Runtime SDK 中getSecretKey接口,您将无法使用getSecretKey获取临时SK。 |
getSecurityAccessKey() |
获取用户委托的SecurityAccessKey(有效期24小时),使用该方法需要给函数配置委托。 |
getSecuritySecretKey() |
获取用户委托的SecuritySecretKey(有效期24小时),使用该方法需要给函数配置委托。 |
getSecurityToken() |
获取用户委托的SecurityToken(有效期24小时),使用该方法需要给函数配置委托。 |
getUserData(string key) |
通过key获取用户通过环境变量传入的值。 |
getFunctionName() |
获取函数名称。 |
getRunningTimeInSeconds () |
获取函数超时时间。 |
getVersion() |
获取函数的版本。 |
getMemorySize() |
分配的内存。 |
getCPUNumber() |
获取函数占用的CPU资源。 |
getPackage() |
获取函数组。 |
getToken() |
获取用户委托的token(有效期24小时),使用该方法需要给函数配置委托。 |
getLogger() |
获取context提供的logger方法,返回一个日志输出类,通过使用其info方法按“时间-请求ID-输出内容”的格式输出日志。 如调用info方法输出日志: logg = context.getLogger()$ $logg->info("hello") |
getAlias |
获取函数的别名 |
getToken()、getAccessKey()和getSecretKey()方法返回的内容包含敏感信息,请谨慎使用,避免造成用户敏感信息的泄露。
开发PHP函数
开发PHP函数步骤如下:
- 创建函数
- 编写打印helloworld的代码。
打开文本编辑器,编写helloworld函数,代码如下,文件命名为“helloworld.php”,保存文件。
1 2 3 4
<?php function printhello() { echo 'Hello world!'; }
- 定义FunctionGraph函数
打开文本编辑,定义函数,代码如下,文件命名为index.php,保存文件(与helloworld.php保存在同一文件夹下)。
1 2 3 4 5 6 7 8
<?php include_once 'helloworld.php'; function handler($event, $context) { $output = json_encode($event); printhello(); return $output; }
- 函数仅支持返回如下几种类型的值。
- Null:函数返回的HTTP响应Body为空。
- string:函数返回的HTTP响应Body内容为该字符串内容。
- 其他:函数会返回值作为对象进行json编码,并将编码后的内容作为HTTP响应的Body,同时设置响应的“Content-Type”头为“text/plain”。
- 当函数的事件源是APIG时,相关约束条件请参考Base64解码和返回结构体的说明。
- 函数仅支持返回如下几种类型的值。
- 编写打印helloworld的代码。
- 工程打包
函数工程创建以后,可以得到以下目录,选中工程所有文件,打包命名为“fss_examples_php7.3.zip”,如图1所示。
本例函数工程文件保存在“~/Code/”文件夹下,在打包的时候务必进入Code文件夹下选中所有工程文件进行打包,这样做的目的:由于定义了FunctionGraph函数的index.php是程序执行入口,确保fss_examples_php7.3.zip解压后,index.php文件位于根目录。
- 创建FunctionGraph函数,上传程序包
登录FunctionGraph,创建PHP函数,上传fss_examples_php7.3.zip文件。如 图2所示。
- 函数执行入口中的index与步骤定义FunctionGraph函数的文件名保持一致,通过该名称找到FunctionGraph函数所在文件。
- 函数执行入口中的handler为函数名,与步骤定义FunctionGraph函数中创建的index.php文件中的函数名保持一致。
- 函数执行过程为:用户上传fss_examples_php7.3.zip保存在OBS中,触发函数后,解压缩zip文件,通过index匹配到FunctionGraph函数所在文件,通过handler匹配到index.php文件中定义的FunctionGraph函数,找到程序执行入口,执行函数。
在函数工作流控制台左侧导航栏选择“函数 > 函数列表”,单击需要设置的“函数名称”进入函数详情页,选择“设置 > 常规设置”,配置“函数执行入口”参数,如图3所示。其中参数值为“index.handler”格式,“index”和“handler”支持自定义命名。
- 测试函数
- 创建测试事件。
- 在函数详情页,选择已配置测试事件,单击“测试”。
- 执行函数
函数执行结果分为三部分,分别为函数返回(由return返回)、执行摘要、日志输出(由echo方法获取的日志方法输出)。
执行结果
执行结果由3部分组成:函数返回、执行摘要和日志。
参数项 |
执行成功 |
执行失败 |
---|---|---|
函数返回 |
返回函数中定义的返回信息。 |
返回包含错误信息、错误类型和堆栈异常报错信息的JSON文件。格式如下: { "errorMessage": "", "errorType": "", "stackTrace": {} } errorMessage:Runtime返回的错误信息 errorType:错误类型 stackTrace:Runtime返回的堆栈异常报错信息 |
执行摘要 |
显示请求ID、配置内存、执行时长、实际使用内存和收费时长。 |
显示请求ID、配置内存、执行时长、实际使用内存和收费时长。 |
日志 |
打印函数日志,最多显示4KB的日志。 |
打印报错信息,最多显示4KB的日志。 |