在函数计算中使用PHP编程,需要定义一个函数作为入口函数。本文介绍了PHP事件函数的结构和特点。
事件函数入口
一个最简单的入口函数定义如下所示。
<?php
function handler($event, $context) {
return "hello world";
}
事件函数名
handler
需要与创建函数时的handler
字段相对应。例如创建函数时指定的handler
为index.handler
,函数计算则会加载index.php
文件中定义的handler
函数。
{
"key": "value"
}
事件函数$event参数
$event
参数是函数的输入参数,也是您调用函数时传入的数据,其数据类型是字符串。PHP函数直接使用您指定的$event
参数,不会做任何预处理。您在函数中可以根据实际情况解析$event
。例如输入数据是一个JSON字符串,您可以把输入的数据转换成一个数组。以下代码示例演示了一个参数解析的过程。
在PHP函数代码中解析上文$event
,返回结果为value
。
<?php
function handler($event, $context) {
$eventObj = json_decode($event, $assoc = true);
return $eventObj['key'];
}
事件函数$context参数
$context
参数中包含函数的运行时信息,例如请求ID(requestId
)和临时身份验证securityToken,便于您在代码中使用这些信息。$context
参数的数据类型是数组,定义如下所示。
[
'requestId' => 'b1c5100f-819d-c421-3a5e-7782a27d8a33',
'credentials' => [
'accessKeyId' => 'STS.access_key_id',
'accessKeySecret' => 'access_key_secret',
'securityToken' => 'security_token',
],
'function' => [
'name' => 'my-func',
'handler' => 'index.handler',
'memory' => 128,
'timeout' => 10,
],
'service' =>[
'name' => 'my-service',
'logProject' => 'my-log-project',
'logStore' => 'my-log-store',
'qualifier' => 'qualifier',
'versionId' => '1',
'initializer' => 'index.initializer',
'initializationTimeout' => 10,
],
'region' => 'cn-shanghai',
'accountId' => '123456'
]
在$context
中包含了以下信息。
信息类型 | 信息类型说明 |
---|---|
requestId | 本次调用请求的唯一ID,常用于问题复查或历史调用计数。 |
function | 当前调用的函数的一些基本信息,例如函数名、函数入口、函数内存和超时时间。 |
credentials | 函数计算服务通过扮演您提供的服务角色获得的一组临时密钥,每15分钟更新一次。您可以在代码中使用credentials去访问相应的服务( 例如OSS ),这就避免了您把自己的AccessKey信息写死在函数代码里。详情请参见服务角色。 |
service | 当前调用的函数所在的service的信息,包含service的名字、接入的日志服务的logProject和logStore信息、service的版本信息、qualifier和version_id。其中qualifier表示调用函数时指定的service版本或别名,version_id表示实际调用的service版本。 |
region | 当前调用的函数所在区域,例如cn-shanghai。详情请参见地域和可用区。 |
accountId | 当前调用函数用户的阿里云Account ID。详情请参见获取账号ID。 |
事件函数示例
临时密钥用于辨识请求者身份和权限,在访问其他服务,例如OSS时,您必须设置securityToken。下文的代码示例演示了如何使用临时密钥向OSS的一个Bucket上传一个.txt格式的文件。
<?php
use OSS\OssClient;
function handler($event, $context) {
$accessKeyId = $context["credentials"]["accessKeyId"];
$accessKeySecret = $context["credentials"]["accessKeySecret"];
$securityToken = $context["credentials"]["securityToken"];
$endpoint = "oss-cn-shenzhen.aliyuncs.com";
$ossClient = new OssClient($accessKeyId, $accessKeySecret, $endpoint, false, $securityToken);
$bucket = "my-bucket";
$object = "php.txt";
$content = "Hello fc.";
try {
$ossClient->putObject($bucket, $object, $content);
} catch (OssException $e) {
print($e->getMessage());
}
return 'sucess';
};