在函数计算中使用PHP编程,需要定义一个函数作为入口函数。本文介绍了PHP事件函数的结构和特点。

事件函数入口

一个最简单的入口函数定义如下所示。

<?php
function handler($event, $context) {
    return "hello world";
}        

事件函数名

handler需要与创建函数时的handler字段相对应。例如创建函数时指定的handlerindex.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';
};