tkotosz/fn-fdk-php

Fn的PHP函数开发套件

1.0.2 2019-01-05 15:20 UTC

This package is auto-updated.

Last update: 2024-09-08 06:47:03 UTC


README

fn-fdk-go为编写php fn代码提供了便利函数

安装fn-fdk-php

您可以使用composer手动安装它

composer require tkotosz/fn-fdk-php

或者直接使用php init镜像来创建新的函数,如下所示

fn init --init-image tkotosz/fn-php-init myfunc

这将为您生成函数所需的所有文件,包括composer json和docker文件来安装此fdk。

创建PHP函数

编写PHP函数只是编写一个处理函数,您将其传递给FDK,以便在每次调用函数时调用。

首先使用fn init创建一个php函数

fn init --init-image tkotosz/fn-php-init phpfunc
cd phpfunc

这将在func.php中创建一个简单的hello world函数

<?php

require('vendor/autoload.php');

$fdk = new Tkotosz\FnPhpFdk\Fdk();

$fdk->handle(function ($input) {
    $name = 'World';
    if (isset($input['name'])) {
        $name = $input['name'];
    }
    return ['message' => 'Hello ' . $name];
});

处理函数接收发送到函数的输入并返回一个响应。默认情况下,输入被视为json,自动转换为数组,响应也是一个数组(或可序列化为json的对象),也自动转换为json。使用FDK,您无需担心读取http请求或发送响应。FDK让您专注于函数逻辑而不是机制。

现在运行它!

fn deploy --local --app fdkdemo 
fn invoke fdkdemo phpfunc 

您应该看到以下输出

{"message":"Hello World"}

用输入运行它

echo -n '{"name":"Tibor"}' | fn invoke fdkdemo phpfunc

您应该看到以下输出

{"message":"Hello Tibor"}

现在您有一个基本的运行中的PHP函数,您可以对其进行修改并添加您想要的任何内容。

函数上下文

函数调用上下文详细信息可通过可选的函数参数获取。要接收上下文对象,只需将第二个参数添加到您的处理函数中。在以下示例中,从上下文中获取callId并将其包含在响应消息中

<?php

require('vendor/autoload.php');

$fdk = new Tkotosz\FnPhpFdk\Fdk();

$fdk->handle(function ($input, $ctx) {
    $name = 'World';
    if (isset($input['name'])) {
        $name = $input['name'];
    }
    return ['message' => 'Hello ' . $name, 'callId' => $ctx->getCallId()];
});

运行它

echo -n '{"name":"Tibor"}' | fn invoke fdkdemo phpfunc

您应该看到类似的输出

{"message":"Hello Tibor","callId":"01D0F7QX2QNG8G00GZJ00001YV"}

上下文包含有关请求的其他上下文信息,例如

  • ctx->getConfig : 包含函数配置变量的对象(来自环境变量)
  • ctx->getHeaders : 包含输入头部的对象,作为字符串列表
  • ctx->getDeadline : 一个DateTimeImmutable对象,指示函数调用必须在何时处理
  • ctx->getCallId : 当前调用的调用ID
  • ctx->getId : 当前函数的函数ID
  • ctx->getMemory : 分配给此函数的ram MB数量
  • ctx->getContentType : 传入请求的内容类型(如果设置,否则为null)
  • ctx->setResponseHeader(key,values...) : 将响应头设置为一个或多个值
  • ctx->addResponseHeader(key,values...) : 向现有响应头追加值
  • ctx->responseContentType : 设置函数的响应内容类型
  • ctx->setResponseStatus : 设置函数的响应状态码(默认:200)

处理输入/输出

默认情况下,FDK将尝试解析输入,同样默认情况下,函数的输出将被视为JSON对象,并使用json_encode()进行转换。

要更改输入的处理方式,您可以在fdk->handle中添加一个额外的options参数,该参数指定输入处理策略

$fdk->handle(function ($input) use ($fdk) {
    return ['message' => 'Hello ' . ($input ?: 'World')];
}, ['inputMode' => 'string']);

有效的输入模式包括

  • json(默认)尝试将输入解析为json
  • string始终将输入视为字符串
  • stream 将输入流(流式请求体)传递给您的函数

要更改您函数的输出处理方式,而不是默认方式,您应该使用响应装饰器包装结果值

$fdk->handle(function ($input) use ($fdk) {
    return $fdk->rawResult('Hello '. ($input ?: 'World'));
}, ['inputMode' => 'string']);

可用的装饰器有

  • rawResult({string|ReadableStreamInterface}) 将结果直接传递给响应 - 值可以是字符串或可读流
  • streamResult({resource|ReadableStreamInterface})resourceReadableStreamInterface 的内容管道输出到输出 - 这允许处理来自文件或HTTP响应的数据

使用HTTP头部和设置HTTP状态码

您可以使用 $ctx->getHeaderValue($key) 读取传递给函数调用的http头部,这返回匹配 key 的头部的第一个值,或者您也可以使用 $ctx->getHeaders()$ctx->getHeaderValues($key) 方法。

$fdk->handle(function ($input, $context) use ($fdk) {
    return $context->getHeaders(); // this will return all request headers as json
}, ['inputMode' => 'string']);

出站头部和HTTP状态码可以以类似的方式进行修改

$fdk->handle(function ($input, $context) {
    $context->setResponseStatus(201);
    $context->setResponseContentType('text/plain');
    $context->setResponseHeader('X-Awesomeness-level', 100);
    $context->addResponseHeader('X-Awesome-number', 1);
    $context->addResponseHeader('X-Awesome-number', 2);
    return 'Hello '. ($input ?: 'World');
}, ['inputMode' => 'string']);

示例

请参阅此处示例 这里.