tkotosz / fn-fdk-php
Fn的PHP函数开发套件
Requires
- php: >=7.1
- react/http: ^0.8.3
- react/socket: ^1.1
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
: 当前调用的调用IDctx->getId
: 当前函数的函数IDctx->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
(默认)尝试将输入解析为jsonstring
始终将输入视为字符串stream
将输入流(流式请求体)传递给您的函数
要更改您函数的输出处理方式,而不是默认方式,您应该使用响应装饰器包装结果值
$fdk->handle(function ($input) use ($fdk) { return $fdk->rawResult('Hello '. ($input ?: 'World')); }, ['inputMode' => 'string']);
可用的装饰器有
rawResult({string|ReadableStreamInterface})
将结果直接传递给响应 - 值可以是字符串或可读流streamResult({resource|ReadableStreamInterface})
将resource
或ReadableStreamInterface
的内容管道输出到输出 - 这允许处理来自文件或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']);
示例
请参阅此处示例 这里.