请求处理程序(Handler)

您可以使用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的函数。具体操作,请参见创建事件函数

操作步骤

  1. 登录函数计算控制台,在左侧导航栏,单击函数

  2. 在顶部菜单栏,选择地域,然后在函数页面,单击目标函数。

  3. 在函数配置页面,选择代码页签,在代码编辑器中输入上述示例代码,然后单击部署代码

    说明

    上述示例代码中函数的请求处理程序是index.php中的handler方法。如果您的函数的请求处理程序配置不同,请获取对应的文件和方法进行更新。

  4. 代码页签,单击测试函数右侧的down图标,从下拉列表中选择配置测试参数,输入如下示例测试参数,然后单击确定

    {
      "key1": "value1",
      "key2": "value2",
      "key3": {
        "v1": true,
        "v2": "bye",
        "v3": 1234
      }
    }
  5. 单击测试函数

    执行成功后,您从返回结果中可以看到函数成功返回了上面的JSON格式,并且日志输出里打印了key1key2key3的内容。

示例二:通过临时密钥安全读写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的randombucketexampledir目录下。

    说明

    请根据实际情况,将endpointbucketobjectfilePath替换为真实的资源名称。

前提条件

操作步骤

  1. 登录函数计算控制台,在左侧导航栏,单击函数

  2. 在顶部菜单栏,选择地域,然后在函数页面,单击目标函数。

  3. 在函数配置页面,选择代码页签,在代码编辑器中输入上述示例代码,然后单击部署代码

    说明

    上述示例代码中函数的请求处理程序是index.php中的handler方法。如果您的函数配置的请求处理程序不同,请替换为实际的文件和方法。

  4. 单击测试函数

    函数执行成功后,查看返回结果,您可以看到返回结果为hello world

示例三:调用外部命令

您的PHP程序也可以创建fork进程,调用外部命令。

当您的PHP函数需要调用非PHP语言构建的工具,例如Shell、C++或Go编译的可执行文件,您可以将工具与函数代码一起打包上传,然后在函数中通过运行外部命令来使用工具。常见的调用外部命令的方法有execsystemshell_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触发

操作步骤

  1. 登录函数计算控制台,在左侧导航栏,单击函数

  2. 在顶部菜单栏,选择地域,然后在函数页面,单击目标函数。

  3. 在函数详情页面,单击配置页签,然后再左侧导航栏,单击触发器,在触发器页面获取HTTP触发器的公网访问地址。

  4. 在Curl工具执行以下命令,调用函数。

    curl -i "https://http-trigger-demo.cn-shanghai.fcapp.run" -d 'Hello FC!'
    重要
    • 如果HTTP触发器的认证方式无需认证,您可以直接使用Postman或Curl工具来调用函数。具体操作,请参见本文操作步骤

    • 如果HTTP触发器的认证方式签名认证JWT认证,请使用签名方式或JWT认证方式来调用函数。具体操作,请参见认证鉴权

错误分析

本示例代码支持使用HTTP触发器或者自定义域名调用。如果使用API调用函数,但配置的测试参数不符合HTTP触发器请求格式规范时,会出现报错。

例如,在控制台上调用函数,配置请求参数为 "Hello, FC!",单击测试函数,收到的请求响应如下所示。

The request did not come from an HTTP Trigger, event: Hello FC!