Local development for functions
It is possible to run PHP functions locally.
Warning: To run web apps locally, see Local development for HTTP applications instead.
With Serverless Framework
The serverless bref:local
command invokes your PHP functions locally, using PHP installed on your machine. You can provide an event if your function expects one.
Note: The
serverless bref:local
command is a simpler alternative to the nativeserverless invoke local
command, which tries to run PHP using Docker with very little success. Usebref:local
instead ofinvoke local
.
For example, given this function:
return function (array $event) {
return 'Hello ' . ($event['name'] ?? 'world');
};
# ...
functions:
hello:
handler: my-function.php
runtime: php-81
You can invoke it with or without event data:
$ serverless bref:local -f hello
Hello world
# With JSON event data
$ serverless bref:local -f hello --data '{"name": "Jane"}'
Hello Jane
# With JSON in a file
$ serverless bref:local -f hello --path=event.json
Hello Jane
Note: On Windows PowerShell, you must escape the "double quote" char if you write JSON directly in the CLI. Example:
$ serverless bref:local -f hello --data '{\"name\": \"Bill\"}'
The serverless bref:local
command runs using the local PHP installation. If you prefer to use Docker, check out the "Without Serverless Framework" section below.
API Gateway local development
If you build HTTP applications with API Gateway HTTP events, serverless bref:local
is a bit unpractical because you need to manually craft HTTP events in JSON.
Instead, you can use the bref/dev-server
package to emulate API Gateway locally.
Without Serverless Framework
If you do not use serverless.yml
but something else, like SAM/AWS CDK/Terraform, use the vendor/bin/bref-local
command instead:
$ vendor/bin/bref-local <handler> <event-data>
# For example
$ vendor/bin/bref-local my-function.php
Hello world
# With JSON event data
$ vendor/bin/bref-local my-function.php '{"name": "Jane"}'
Hello Jane
# With a path to a file containing a JSON event.
$ cat event.json
{
"name": "Alex"
}
$ vendor/bin/bref-local --path event.json my-function.php
Hello Alex
If you want to run your function in Docker:
$ docker run --rm -it --entrypoint= -v $(PWD):/var/task:ro bref/php-81:2 vendor/bin/bref-local my-function.php
# You can also use the `dev` images for a simpler command (and Xdebug and Blackfire in the image):
$ docker run --rm -it -v $(PWD):/var/task:ro bref/php-81-fpm-dev:2 vendor/bin/bref-local my-function.php
You can also use Docker Compose:
version: "3.5"
services:
app:
image: bref/php-81-fpm-dev:2
volumes:
- .:/var/task
Then run functions:
$ docker-compose run app vendor/bin/bref-local my-function.php