您可以使用PHP请求处理程序响应接收到的事件并执行相应的业务逻辑。本文介绍PHP请求处理程序的相关概念、结构和使用示例。
什么是请求处理程序
FC函数的请求处理程序,是函数代码中处理请求的方法。当您的FC函数被调用时,函数计算会运行您提供的Handler方法处理请求。您可以通过函数计算控制台的请求处理程序配置Handler。
对PHP语言的FC函数而言,您的请求处理程序格式为文件名.方法名
。例如,您的文件名为main.php
,方法名为handler
,则请求处理程序为main.handler
。
关于FC函数的具体定义和相关操作,请参见创建事件函数。
请求处理程序的具体配置均需符合函数计算平台的配置规范。配置规范因请求处理程序类型而异。
Handler签名
一个简单的Handler签名定义如下。
<?php
function handler($event, $context) {
return 'hello world';
}
示例解析如下:
handler
:方法名称。与函数计算控制台配置的请求处理程序相对应。例如,为FC函数配置的请求处理程序为index.handler
,那么函数计算会去加载index.php
中定义的handler
函数,并从handler
函数开始执行。$event
:您调用函数时传入的参数,其数据类型是字符串。PHP函数直接使用您指定的event
参数,不会做任何预处理,您在函数中可以根据实际情况解析event
。例如,输入数据是JSON字符串,您可以把输入的数据转换为Array。$context
:包含函数的运行时信息,例如请求ID和临时身份验证,便于您在代码中使用这些信息。
如您需要通过HTTP触发器或自定义域名访问函数,请先获取请求结构体再自定义HTTP响应。更多信息,请参见HTTP触发器调用函数。
示例一:解析JSON格式参数
示例代码
当您传入JSON格式参数时,函数计算会透传参数内容,需要您在代码中自行解析。下面是解析JSON格式事件的代码示例。
<?php
function handler($event, $context) {
$v = json_decode($event, true);
var_dump($v['key1']);
var_dump($v['key2']);
var_dump($v['key3']);
return $v;
}
前提条件
创建运行环境为PHP的函数。具体操作,请参见创建事件函数。
操作步骤
登录函数计算控制台,在左侧导航栏,单击函数。
在顶部菜单栏,选择地域,然后在函数页面,单击目标函数。
在函数配置页面,选择代码页签,在代码编辑器中输入上述示例代码,然后单击部署代码。
说明上述示例代码中函数的请求处理程序是
index.php
中的handler
方法。如果您的函数的请求处理程序配置不同,请获取对应的文件和方法进行更新。在代码页签,单击测试函数右侧的图标,从下拉列表中选择配置测试参数,输入如下示例测试参数,然后单击确定。
{ "key1": "value1", "key2": "value2", "key3": { "v1": true, "v2": "bye", "v3": 1234 } }
单击测试函数。
执行成功后,您从返回结果中可以看到函数成功返回了上面的JSON格式,并且日志输出里打印了
key1
,key2
和key3
的内容。
示例二:通过临时密钥安全读写OSS的资源
示例代码
您可以使用函数计算为您提供的临时密钥访问对象存储OSS,代码示例如下所示。
<?php
use OSS\OssClient;
use OSS\Core\OssException;
function handler($event, $context) {
/*
阿里云账号AccessKey拥有所有API的访问权限,建议您使用RAM用户进行API访问或日常运维。
建议不要把AccessKey ID和AccessKey Secret保存到工程代码里,否则可能导致AccessKey泄露,威胁您账号下所有资源的安全。
本示例以从上下文中获取AccessKey/AccessSecretKey为例。
*/
$creds = $context["credentials"];
$accessKeyId = $creds["accessKeyId"];
$accessKeySecret = $creds["accessKeySecret"];
$securityToken = $creds["securityToken"];
$endpoint = "https://oss-cn-hangzhou-internal.aliyuncs.com";
$bucket= "randombucket";
$object = "exampledir/index.php";
$filePath = "/code/index.php";
try{
$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false, $securityToken);
$ossClient->uploadFile($bucket, $object, $filePath);
} catch(OssException $e) {
printf(__FUNCTION__ . ": FAILED\n");
printf($e->getMessage() . "\n");
return $e->getMessage();
}
return 'hello world';
}
示例代码解析如下:
$creds = $context["credentials"]
:表示从$context
参数中获取临时密钥,避免在代码中硬编码密码等敏感信息。以上代码表示将
/code/index.php
文件上传到OSS的randombucket
的exampledir目录下。说明请根据实际情况,将
endpoint
、bucket
、object
和filePath
替换为真实的资源名称。
前提条件
为服务配置具有访问对象存储OSS的权限的角色。具体操作,请参见授予函数计算访问其他云服务的权限。
创建运行环境为PHP的函数。具体操作,请参见创建事件函数。
操作步骤
登录函数计算控制台,在左侧导航栏,单击函数。
在顶部菜单栏,选择地域,然后在函数页面,单击目标函数。
在函数配置页面,选择代码页签,在代码编辑器中输入上述示例代码,然后单击部署代码。
说明上述示例代码中函数的请求处理程序是
index.php
中的handler
方法。如果您的函数配置的请求处理程序不同,请替换为实际的文件和方法。单击测试函数。
函数执行成功后,查看返回结果,您可以看到返回结果为
hello world
。
示例三:调用外部命令
您的PHP程序也可以创建fork
进程,调用外部命令。
当您的PHP函数需要调用非PHP语言构建的工具,例如Shell、C++或Go编译的可执行文件,您可以将工具与函数代码一起打包上传,然后在函数中通过运行外部命令来使用工具。常见的调用外部命令的方法有exec、system和shell_exec。
以下示例代码为调用Linux的ls -halt
命令,输出当前目录下的文件详情。
<?php
function handler($event, $context) {
return shell_exec("ls -halt /code");
}
示例四:使用HTTP触发器调用函数
示例代码
<?php
function handler($event, $context) {
$logger = $GLOBALS['fcLogger'];
$logger->info('hello world');
$logger->info('receive event: ' . $event);
try {
$evt = json_decode($event, true);
if (is_null($evt['body'])) {
return "The request did not come from an HTTP Trigger, event: " . $event;
}
$body = $evt['body'];
if ($evt['isBase64Encoded']) {
$body = base64_decode($evt['body']);
}
return array(
"statusCode" => 200,
'headers' => array("Content-Type" => "text/plain"),
'isBase64Encoded' => false,
"body" => $body
);
} catch (Exception $e) {
$logger->error("Caught exception: " . $e->getMessage());
return "The request did not come from an HTTP Trigger, event: " . $event;
}
}
前提条件
已使用上述示例创建运行环境为PHP的函数,并创建HTTP触发器。具体操作,请参见创建事件函数和配置HTTP触发器并使用HTTP触发。
操作步骤
登录函数计算控制台,在左侧导航栏,单击函数。
在顶部菜单栏,选择地域,然后在函数页面,单击目标函数。
在函数详情页面,单击配置页签,然后再左侧导航栏,单击触发器,在触发器页面获取HTTP触发器的公网访问地址。
在Curl工具执行以下命令,调用函数。
curl -i "https://http-trigger-demo.cn-shanghai.fcapp.run" -d 'Hello FC!'
错误分析
本示例代码支持使用HTTP触发器或者自定义域名调用。如果使用API调用函数,但配置的测试参数不符合HTTP触发器请求格式规范时,会出现报错。
例如,在控制台上调用函数,配置请求参数为 "Hello, FC!"
,单击测试函数,收到的请求响应如下所示。
The request did not come from an HTTP Trigger, event: Hello FC!