google/cloud-functions-framework

Google Cloud Functions Framework for PHP

v1.4.0 2024-09-20 02:10 UTC

README

PHP unit CI PHP lint CI PHP conformace CI Security Scorecard

一个开源的FaaS(函数即服务)框架,用于编写可移植的PHP函数。

函数框架允许你编写轻量级的函数,这些函数可以在许多不同的环境中运行,包括

该框架允许您从

use Psr\Http\Message\ServerRequestInterface;

function helloHttp(ServerRequestInterface $request)
{
    return "Hello World from a PHP HTTP function!" . PHP_EOL;
}

转换到

curl http://my-url
# Output: "Hello World from a PHP HTTP function!"

所有这些都不需要担心编写HTTP服务器或复杂的请求处理逻辑。

观看 此视频 了解更多关于函数框架的信息。

功能

  • 启动本地开发服务器以进行快速测试
  • 响应请求调用函数
  • 自动反序列化符合 CloudEvents 规范的事件
  • 可在无服务器平台之间移植

安装

使用 Composer 将函数框架添加到您的 composer.json 文件中。

composer require google/cloud-functions-framework

定义您的函数

创建一个包含以下内容的 index.php 文件

<?php

use Psr\Http\Message\ServerRequestInterface;

function helloHttp(ServerRequestInterface $request)
{
    return "Hello World from a PHP HTTP function!" . PHP_EOL;
}

快速入门

在本地运行您的函数

完成 安装定义您的函数 下的步骤后,运行以下命令

export FUNCTION_TARGET=helloHttp
php -S localhost:8080 vendor/google/cloud-functions-framework/router.php

在浏览器中打开 http://localhost:8080/ 并看到 来自 PHP HTTP 函数的“Hello World”!

在容器中运行您的函数

完成 安装定义您的函数 下的步骤后,使用示例 Dockerfile 构建容器

docker build . \
    -f vendor/google/cloud-functions-framework/examples/hello/Dockerfile \
    -t my-cloud-function

运行云函数框架容器

docker run -p 8080:8080 \
    -e FUNCTION_TARGET=helloHttp \
    my-cloud-function

在浏览器中打开 http://localhost:8080/ 并看到 来自 PHP HTTP 函数的“Hello World”。您还可以从另一个终端窗口使用 curl 向此函数发送请求

curl localhost:8080
# Output: Hello World from a PHP HTTP function!

在 Google Cloud Functions 上运行您的函数

注意:有关大量示例,请参阅 PHP 函数示例官方如何操作指南

按照以下步骤将应用程序部署到 Google Cloud Functions。有关函数部署的更多信息,请参阅 GCF 文档

要在 Cloud Functions 上运行您的函数,首先您必须安装并认证 gcloud SDK

确保您的源文件(定义您的函数)被命名为 index.php。函数框架允许您选择函数源文件,但云函数目前使用默认的 index.php

确定要调用源文件中的哪个函数,即您编写函数时使用的名称。这被称为 目标

为您的函数选择一个 Cloud Functions 名称。该 名称 识别此函数部署(例如,在云控制台中)并也是函数默认 URL 的一部分。(注意:名称和目标不必相同。)

然后,从包含您函数源代码的目录中,使用 gcloud 命令进行部署

gcloud functions deploy $YOUR_FUNCTION_NAME \
    --runtime=php74 \
    --entry-point=$YOUR_FUNCTION_TARGET \
    --trigger-http

如果 目标 的值与 名称 相同,则可以省略 --entry-point 标志。

如果您的函数处理事件而不是 HTTP 请求,则需要将 --trigger-http 替换为不同的触发器。有关详细信息,请参阅 gcloud functions deploy 的参考文档

要更新您的部署,只需使用相同的函数 名称 重新部署。不需要配置标志。

在 Cloud Run 上运行您的函数

要在 Cloud Run 上运行您的函数,首先您必须安装 gcloud SDK进行认证

此外,您还需要具有您想要使用的 Google Cloud 项目 的 Google Cloud 项目 ID。

在完成 安装定义您的函数 下的步骤后,使用示例 Dockerfile 构建容器。此 Dockerfile 是基于 PHP 7.4 App Engine 运行时 构建的,但只要您的应用程序监听 端口 8080,您可以使用任何容器。

docker build . \
    -f vendor/google/cloud-functions-framework/examples/hello/Dockerfile \
    -t gcr.io/$GCLOUD_PROJECT/my-cloud-function

注意:请务必将 $GCLOUD_PROJECT 替换为您的 Google Cloud 项目 ID,或使用 export GCLOUD_PROJECT="some-project-id" 设置环境变量。

接下来,将您的镜像推送到 Google Container Registry。这将允许您直接从 Cloud Run 部署它。

docker push gcr.io/$GCLOUD_PROJECT/my-cloud-function

最后,使用 gcloud 命令行工具部署到 Cloud Run

gcloud run deploy my-cloud-function \
    --image=gcr.io/$GCLOUD_PROJECT/my-cloud-function \
    --platform managed \
    --set-env-vars "FUNCTION_TARGET=helloHttp" \
    --allow-unauthenticated \
    --region $CLOUD_RUN_REGION \
    --project $GCLOUD_PROJECT

注意:请务必将 $CLOUD_RUN_REGION 替换为您的 Cloud Run 实例的 正确区域,例如 us-central1

您的实例部署后,您可以在提供的 URL 中访问它,或在 Cloud Console 中查看它。

使用 CloudEvents

函数框架可以将传入的 CloudEvents 有效负载反序列化为 cloudevent 对象。当它收到请求时,这将作为参数传递给您的函数。请注意,您的函数必须使用 cloudevent 函数签名。

use Google\CloudFunctions\CloudEvent;

function helloCloudEvent(CloudEvent $cloudevent)
{
    // Print the whole CloudEvent
    $stdout = fopen('php://stdout', 'wb');
    fwrite($stdout, $cloudevent);
}

您还需要将 FUNCTION_SIGNATURE_TYPE 环境变量设置为 cloudevent

export FUNCTION_TARGET=helloCloudEvent
export FUNCTION_SIGNATURE_TYPE=cloudevent
php -S localhost:8080 vendor/google/cloud-functions-framework/router.php

在另一个标签页中,以 Cloud Event 格式对您的函数进行 cURL 请求

curl localhost:8080 \
    -H "ce-id: 1234567890" \
    -H "ce-source: //pubsub.googleapis.com/projects/MY-PROJECT/topics/MY-TOPIC" \
    -H "ce-specversion: 1.0" \
    -H "ce-type: com.google.cloud.pubsub.topic.publish" \
    -d '{"foo": "bar"}'

您原始过程应该输出以下内容

CLOUDEVENT metadata:
- id: 1234567890
- source: //pubsub.googleapis.com/projects/MY-PROJECT/topics/MY-TOPIC
- specversion: 1.0
- type: com.google.cloud.pubsub.topic.publish
- datacontenttype:
- dataschema:
- subject:
- time:

重要:以上关于部署到 Docker 容器和 Cloud Run 的教程也适用于 CloudEvents,只要正确设置 FUNCTION_TARGETFUNCTION_SIGNATURE_TYPE

使用 PSR-7 HTTP 对象

您的函数的第一个参数是一个实现 PSR-7 ServerRequestInterfaceRequest 对象。

use Psr\Http\Message\ServerRequestInterface;

function helloHttp(ServerRequestInterface $request): string
{
    return sprintf("Hello %s from PHP HTTP function!" . PHP_EOL,
        $request->getQueryParams()['name'] ?? 'World');
}

您可以返回一个与 PSR-7 兼容的 ResponseInterface 而不是字符串。这允许您设置额外的请求属性,例如 HTTP 状态代码和头信息。

use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Message\ResponseInterface;
use GuzzleHttp\Psr7\Response;
use GuzzleHttp\Psr7\Utils;

function helloHttp(ServerRequestInterface $request): ResponseInterface
{
    $body = sprintf("Hello %s from PHP HTTP function!" . PHP_EOL,
        $request->getQueryParams()['name'] ?? 'World');

    return (new Response())
        ->withBody(Utils::streamFor($body))
        ->withStatus(418) // I'm a teapot
        ->withHeader('Foo', 'Bar');
}

对该函数的请求将生成类似以下内容的响应

HTTP/1.1 418 I'm a teapot
Host: localhost:8080
Date: Wed, 03 Jun 2020 00:48:38 GMT
Foo: Bar

Hello World from PHP HTTP function!

有关如何使用请求和响应对象,请参阅 PSR-7 文档

使用 Google Cloud Storage

当您使用 composer 需要 google/cloud-storage 包时,函数框架将注册 gs:// 流包装器。这使得您的函数可以像任何文件系统一样读取和写入 Google Cloud Storage。

// Get the contents of an object in GCS
$object = file_get_contents('gs://{YOUR_BUCKET_NAME}/object.txt');
// Make modifications
$object .= "\nadd a line";
// Write the new contents back to GCS
file_put_contents('gs://{YOUR_BUCKET_NAME}/object.txt', $object);

您可以使用 stream_wrapper_unregister 在任何时候注销它。

// unregister the automatically registered one
stream_wrapper_unregister('gs');

在 Knative 上运行您的函数

Cloud Run 和 Cloud Run on GKE 都实现了 Knative Serving API。函数框架旨在与 Knative 环境兼容。只需构建并部署您的容器到 Knative 环境即可。

如果您希望对环境有更多控制,可以将容器镜像 部署到 GKE 上的 Cloud Run。使用 Cloud Run on GKE,您可以在 GKE 集群上运行您的函数,这使您能够对环境有额外的控制(包括使用基于 GPU 的实例、更长的超时时间等)。

配置函数框架

您可以使用以下环境变量来配置函数框架

贡献

欢迎并鼓励为此库做出贡献。有关如何开始的更多信息,请参阅 CONTRIBUTING