An open source FaaS (Function as a service) framework for writing portable PHP functions.
The Functions Framework lets you write lightweight functions that run in many different environments, including:
- Your local development machine
- Knative-based environments
The framework allows you to go from:
usePsr\Http\Message\ServerRequestInterface; functionhelloHttp(ServerRequestInterface$request) { return"Hello World from a PHP HTTP function!" . PHP_EOL; }
To:
curl http://my-url # Output: "Hello World from a PHP HTTP function!"
All without needing to worry about writing an HTTP server or complicated request handling logic.
Watch this video to learn more about Functions Frameworks.
- Spin up a local development server for quick testing
- Invoke a function in response to a request
- Automatically unmarshal events conforming to the CloudEvents spec
- Portable between serverless platforms
Add the Functions Framework to your composer.json
file using Composer.
composer require google/cloud-functions-framework
Create an index.php
file with the following contents:
<?phpusePsr\Http\Message\ServerRequestInterface; functionhelloHttp(ServerRequestInterface$request) { return"Hello World from a PHP HTTP function!" . PHP_EOL; }
After completing the steps under Installation and Define your Function, run the following commands:
export FUNCTION_TARGET=helloHttp php -S localhost:8080 vendor/google/cloud-functions-framework/router.php
Open http://localhost:8080/
in your browser and see Hello World from a PHP HTTP function!.
After completing the steps under Installation and Define your Function, build the container using the example Dockerfile
:
docker build . \ -f vendor/google/cloud-functions-framework/examples/hello/Dockerfile \ -t my-cloud-function
Run the cloud functions framework container:
docker run -p 8080:8080 \ -e FUNCTION_TARGET=helloHttp \ my-cloud-function
Open http://localhost:8080/
in your browser and see Hello World from a PHP HTTP function. You can also send requests to this function using curl
from another terminal window:
curl localhost:8080 # Output: Hello World from a PHP HTTP function!
NOTE: For an extensive list of samples, see the [PHP functions samples][functions-samples] and the [official how-to guides][functions-how-to].
Follow the Cloud Run function quickstart for PHP to learn how to deploy a function to Cloud Run.
You can manually build your function as a container and deploy it into Cloud Run. Follow the Cloud Run instructions for building a function for complete instructions.
The Functions Framework can unmarshall incoming CloudEvents payloads to a cloudevent
object. This will be passed as arguments to your function when it receives a request. Note that your function must use the cloudevent function signature:
useGoogle\CloudFunctions\CloudEvent; functionhelloCloudEvent(CloudEvent$cloudevent) { // Print the whole CloudEvent$stdout = fopen('php://stdout', 'wb'); fwrite($stdout, $cloudevent); }
You will also need to set the FUNCTION_SIGNATURE_TYPE
environment variable to cloudevent
.
export FUNCTION_TARGET=helloCloudEvent export FUNCTION_SIGNATURE_TYPE=cloudevent php -S localhost:8080 vendor/google/cloud-functions-framework/router.php
In a separate tab, make a cURL request in Cloud Event format to your function:
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"}'
Your original process should output the following:
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:
IMPORTANT: The above tutorials to deploy to a docker container and to Cloud Run work for CloudEvents as well, as long as FUNCTION_TARGET
and FUNCTION_SIGNATURE_TYPE
are set appropriately.
The first parameter of your function is a Request
object which implements the PSR-7 ServerRequestInterface
:
usePsr\Http\Message\ServerRequestInterface; functionhelloHttp(ServerRequestInterface$request): string { returnsprintf("Hello %s from PHP HTTP function!" . PHP_EOL, $request->getQueryParams()['name'] ?? 'World'); }
You can return a PSR-7 compatible ResponseInterface
instead of a string. This allows you to set additional request properties such as the HTTP Status Code and headers.
usePsr\Http\Message\ServerRequestInterface; usePsr\Http\Message\ResponseInterface; useGuzzleHttp\Psr7\Response; useGuzzleHttp\Psr7\Utils; functionhelloHttp(ServerRequestInterface$request): ResponseInterface { $body = sprintf("Hello %s from PHP HTTP function!" . PHP_EOL, $request->getQueryParams()['name'] ?? 'World'); return (newResponse()) ->withBody(Utils::streamFor($body)) ->withStatus(418) // I'm a teapot ->withHeader('Foo', 'Bar'); }
A request to this function will produce a response similar to the following:
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!
See the PSR-7 documentation documentation for more on working with the request and response objects.
When you require the google/cloud-storage
package with composer, the functions framework will register the gs://
stream wrapper. This enables your function to read and write to Google Cloud Storage as you would any filesystem:
// 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 GCSfile_put_contents('gs://{YOUR_BUCKET_NAME}/object.txt', $object);
You can unregister this at any time by using stream_wrapper_unregister
:
// unregister the automatically registered onestream_wrapper_unregister('gs');
Cloud Run and Cloud Run on GKE both implement the Knative Serving API. The Functions Framework is designed to be compatible with Knative environments. Just build and deploy your container to a Knative environment.
If you want even more control over the environment, you can deploy your container image to Cloud Run on GKE. With Cloud Run on GKE, you can run your function on a GKE cluster, which gives you additional control over the environment (including use of GPU-based instances, longer timeouts and more).
You can configure the Functions Framework using the environment variables shown below:
Environment variable | Description |
---|---|
FUNCTION_TARGET | The name of the exported function to be invoked in response to requests. |
FUNCTION_SOURCE | The name of the file containing the source code for your function to load. Default: index.php (if it exists) |
FUNCTION_SIGNATURE_TYPE | The signature used when writing your function. Controls unmarshalling rules and determines which arguments are used to invoke your function. Can be either http , event , or cloudevent . Default: http |
Contributions to this library are welcome and encouraged. See CONTRIBUTING for more information on how to get started.