google / cloud-functions-framework
Google Cloud Functions Framework for PHP
Requires
- php: >=8.1
- cloudevents/sdk-php: ^1.0
- guzzlehttp/psr7: ^1.7|^2.0
- psr/http-message: ^2.0
Requires (Dev)
- guzzlehttp/guzzle: ^7.2
- phpunit/phpunit: ^10.5|^11.3
Suggests
- google/cloud-storage: Google Cloud Storage client library for storing and persisting objects. When included, the functions framework will register the gs:// stream wrapper.
- dev-main
- v1.4.0
- v1.3.0
- v1.2.0
- v1.1.0
- v1.0.0
- v0.8.0
- v0.7.2
- v0.7.1
- v0.7.0
- v0.6.0
- v0.5.0
- v0.4.0
- v0.3.0
- v0.2.1
- v0.2
- v0.1
- dev-release-please--branches--main
- dev-fix-ci
- dev-jrmfg-patch-2
- dev-kennethrosario/update-scorecard
- dev-jrmfg-patch-1
- dev-HKWinterhalter-patch-1
- dev-kenneth-rosario-patch-1
- dev-kennethrosario/fix-ci-on-forks
- dev-josephlewis42-patch-2
- dev-garethgeorge/blunderbuss
- dev-josephlewis42-patch-1
- dev-kennethrosario/apply-recommended-egress-policy
- dev-kennethrosario/add-scorecard-to-readme
- dev-kennethrosario/configure-blunderbuss
- dev-kennethrosario/address-scorecard-findings
This package is auto-updated.
Last update: 2024-09-20 02:18:17 UTC
README
一个开源的FaaS(函数即服务)框架,用于编写可移植的PHP函数。
函数框架允许你编写轻量级的函数,这些函数可以在许多不同的环境中运行,包括
- 您的本地开发机器
- Cloud Run 和 GKE 上的 Cloud Run
- 基于 Knative 的环境
该框架允许您从
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_TARGET
和 FUNCTION_SIGNATURE_TYPE
。
使用 PSR-7 HTTP 对象
您的函数的第一个参数是一个实现 PSR-7 ServerRequestInterface
的 Request
对象。
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。