From ef62cbcbe9e2a2152c8964b0fb17a3c7b3ae95e8 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sat, 24 May 2025 22:07:56 +0200 Subject: [PATCH 01/53] Start a v3 branch --- .github/aws/github-role.yml | 4 +-- .github/workflows/update-layer-versions.yml | 14 ++++---- docs/runtimes.mdx | 2 +- docs/runtimes/runtimes-details.mdx | 8 ++--- docs/upgrading/_meta.json | 3 +- docs/upgrading/v3.md | 23 +++++++++++++ index.js | 2 +- plugin/layers.js | 2 +- plugin/run-console.js | 2 +- tests/PluginTest.php | 36 ++++++++++----------- tests/Sam/template.yaml | 8 ++--- utils/layers.json/update.php | 4 +-- 12 files changed, 65 insertions(+), 43 deletions(-) create mode 100644 docs/upgrading/v3.md diff --git a/.github/aws/github-role.yml b/.github/aws/github-role.yml index 6f7be1e06..cd86e9c4e 100644 --- a/.github/aws/github-role.yml +++ b/.github/aws/github-role.yml @@ -15,12 +15,12 @@ Resources: - Effect: Allow Action: sts:AssumeRoleWithWebIdentity Principal: - Federated: arn:aws:iam::534081306603:oidc-provider/token.actions.githubusercontent.com + Federated: arn:aws:iam::873528684822:oidc-provider/token.actions.githubusercontent.com Condition: StringLike: token.actions.githubusercontent.com:sub: !Sub repo:${FullRepoName}:* Policies: - - PolicyName: RetrieveLayersForLayerJsRole + - PolicyName: RetrieveLayersForLayerRole PolicyDocument: Statement: - Effect: Allow diff --git a/.github/workflows/update-layer-versions.yml b/.github/workflows/update-layer-versions.yml index eb5ebadcc..9cff6a441 100644 --- a/.github/workflows/update-layer-versions.yml +++ b/.github/workflows/update-layer-versions.yml @@ -1,4 +1,4 @@ -name: Update layer versions (Bref v2) +name: Update layer versions # Triggered manually or automatically when new Bref layers published on: @@ -26,12 +26,12 @@ jobs: steps: - uses: actions/checkout@v4 with: - ref: master + ref: v3 # temporary until v3 becomes the main branch - name: Set AWS credentials uses: aws-actions/configure-aws-credentials@v4 with: - role-to-assume: arn:aws:iam::534081306603:role/bref-github-actions + role-to-assume: arn:aws:iam::873528684822:role/bref-github-actions role-session-name: bref-github-actions aws-region: us-east-1 @@ -47,10 +47,10 @@ jobs: - run: make layers.json - name: Create Pull Request - uses: peter-evans/create-pull-request@v5 + uses: peter-evans/create-pull-request@v7 with: commit-message: Update layer versions - title: Update Lambda layers [${{ inputs.release_name }}](${{ inputs.release_html_url }}) + title: Update v3 layers [${{ inputs.release_name }}](${{ inputs.release_html_url }}) body: | New AWS Lambda layers [have been released](https://github.com/brefphp/aws-lambda-layers/releases): @@ -61,7 +61,5 @@ jobs: If you are using AWS Lambda layer ARNs, check out [runtimes.bref.sh](https://runtimes.bref.sh/) to see the latest ARNs. branch: new-layer-versions + base: v3 # temporary until v3 becomes the main branch delete-branch: true # delete after merging or closing the PR - # https://github.com/actions/checkout/issues/13#issuecomment-724415212 - committer: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> - author: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> diff --git a/docs/runtimes.mdx b/docs/runtimes.mdx index 551e43324..57606091e 100644 --- a/docs/runtimes.mdx +++ b/docs/runtimes.mdx @@ -150,7 +150,7 @@ functions: # ... runtime: provided.al2 layers: - - 'arn:aws:lambda:us-east-1:534081306603:layer:php-81:21' + - 'arn:aws:lambda:us-east-1:873528684822:layer:php-81:21' ``` ☝️ `provided.al2` [is the generic Linux environment for custom runtimes](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html#runtimes-custom-use), and the `layers` config points to Bref's AWS Lambda layers. diff --git a/docs/runtimes/runtimes-details.mdx b/docs/runtimes/runtimes-details.mdx index 3aef0a18f..9e6e940cd 100644 --- a/docs/runtimes/runtimes-details.mdx +++ b/docs/runtimes/runtimes-details.mdx @@ -15,12 +15,12 @@ Bref runtimes are distributed as [AWS Lambda layers](https://docs.aws.amazon.com The layer names (aka "[ARN](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference-arns.html)") follow this pattern: ``` -arn:aws:lambda::534081306603:layer:: +arn:aws:lambda::873528684822:layer:: ``` For example: ``` -arn:aws:lambda:us-east-1:534081306603:layer:php-80:21 +arn:aws:lambda:us-east-1:873528684822:layer:php-80:21 ``` You can use layers via their full ARN, for example in `serverless.yml`: @@ -34,7 +34,7 @@ functions: # ... runtime: provided.al2 layers: - - 'arn:aws:lambda:us-east-1:534081306603:layer:php-80:21' + - 'arn:aws:lambda:us-east-1:873528684822:layer:php-80:21' ``` Or if you are using [SAM's `template.yaml`](https://aws.amazon.com/serverless/sam/): @@ -49,7 +49,7 @@ Resources: # ... Runtime: provided.al2 Layers: - - 'arn:aws:lambda:us-east-1:534081306603:layer:php-80:21' + - 'arn:aws:lambda:us-east-1:873528684822:layer:php-80:21' ``` Bref layers work with AWS Lambda regardless of the tool you use to deploy your application: Serverless, SAM, CloudFormation, Terraform, AWS CDK, etc. diff --git a/docs/upgrading/_meta.json b/docs/upgrading/_meta.json index 1a03b074b..94f4120a7 100644 --- a/docs/upgrading/_meta.json +++ b/docs/upgrading/_meta.json @@ -1,3 +1,4 @@ { - "v2": "From 1.x to 2.0" + "v2": "From 1.x to 2.0", + "v3": "From 2.x to 3.0" } \ No newline at end of file diff --git a/docs/upgrading/v3.md b/docs/upgrading/v3.md new file mode 100644 index 000000000..5633101e8 --- /dev/null +++ b/docs/upgrading/v3.md @@ -0,0 +1,23 @@ +--- +introduction: Upgrading guide to go from Bref 2.x to Bref 3.0. +--- + +# Upgrading to Bref 3.0 + +## Smaller breaking changes that might impact you + +The changes below should not impact the majority of users. However, if you are using any of these features, you might need to update your code. + +### Changed the AWS account ID for AWS Lambda layers + +The AWS account ID where Bref layers are published is different for v3. That lets us keep releasing Bref v2 layers without mixing up layer numbers. + +For Bref v3 layers, you need to use `873528684822` as the AWS account number (instead of `534081306603`). + +```bash +# Bref v2 layer +arn:aws:lambda:eu-west-2:534081306603:layer:php-84:xxx + +# Bref v3 layer +arn:aws:lambda:eu-west-2:873528684822:layer:php-84:xxx +``` diff --git a/index.js b/index.js index 8b26658e1..b0d9ffb69 100644 --- a/index.js +++ b/index.js @@ -258,7 +258,7 @@ class ServerlessPlugin { throw new this.serverless.classes.Error(`There is no Bref layer named "${layerName}" in region "${region}".\nThat region may not be supported yet. Check out https://runtimes.bref.sh to see the list of supported regions.\nOpen an issue to ask for that region to be supported: https://github.com/brefphp/bref/issues`); } const version = this.layers[layerName][region]; - return `arn:aws:lambda:${region}:534081306603:layer:${layerName}:${version}`; + return `arn:aws:lambda:${region}:873528684822:layer:${layerName}:${version}`; } /** diff --git a/plugin/layers.js b/plugin/layers.js index fd1307476..f0d9c45c8 100644 --- a/plugin/layers.js +++ b/plugin/layers.js @@ -17,7 +17,7 @@ function listLayers(serverless, log) { log('----------------------------------------------------------------------------------'); for (const [layer, versions] of Object.entries(layers)) { const version = versions[region]; - const arn = `arn:aws:lambda:${region}:534081306603:layer:${layer}:${version}`; + const arn = `arn:aws:lambda:${region}:873528684822:layer:${layer}:${version}`; log(`${padString(layer, 12)} ${padString(version, 9)} ${arn}`); } } diff --git a/plugin/run-console.js b/plugin/run-console.js index 1e8775689..04695be3c 100644 --- a/plugin/run-console.js +++ b/plugin/run-console.js @@ -47,7 +47,7 @@ function getConsoleLayerArn(region) { const json = fs.readFileSync(path.join(__dirname, '../layers.json')); const layers = JSON.parse(json.toString()); const version = layers.console[region]; - return `arn:aws:lambda:${region}:534081306603:layer:console:${version}`; + return `arn:aws:lambda:${region}:873528684822:layer:console:${version}`; } module.exports = {runConsole}; diff --git a/tests/PluginTest.php b/tests/PluginTest.php index afc00d6d6..4da695d1c 100644 --- a/tests/PluginTest.php +++ b/tests/PluginTest.php @@ -13,25 +13,25 @@ public function test the plugin adds the layers(): void $output = $this->slsPrint('serverless.yml'); self::assertFunction($output['functions']['function'], [ - 'arn:aws:lambda:us-east-1:534081306603:layer:php-83:', + 'arn:aws:lambda:us-east-1:873528684822:layer:php-83:', ]); self::assertFunction($output['functions']['fpm'], [ - 'arn:aws:lambda:us-east-1:534081306603:layer:php-83-fpm:', + 'arn:aws:lambda:us-east-1:873528684822:layer:php-83-fpm:', ]); self::assertFunction($output['functions']['console'], [ - 'arn:aws:lambda:us-east-1:534081306603:layer:php-83:', - 'arn:aws:lambda:us-east-1:534081306603:layer:console:', + 'arn:aws:lambda:us-east-1:873528684822:layer:php-83:', + 'arn:aws:lambda:us-east-1:873528684822:layer:console:', ]); self::assertFunction($output['functions']['function-arm'], [ - 'arn:aws:lambda:us-east-1:534081306603:layer:arm-php-83:', + 'arn:aws:lambda:us-east-1:873528684822:layer:arm-php-83:', ]); self::assertFunction($output['functions']['fpm-arm'], [ - 'arn:aws:lambda:us-east-1:534081306603:layer:arm-php-83-fpm:', + 'arn:aws:lambda:us-east-1:873528684822:layer:arm-php-83-fpm:', ]); self::assertFunction($output['functions']['console-arm'], [ - 'arn:aws:lambda:us-east-1:534081306603:layer:arm-php-83:', - 'arn:aws:lambda:us-east-1:534081306603:layer:console:', + 'arn:aws:lambda:us-east-1:873528684822:layer:arm-php-83:', + 'arn:aws:lambda:us-east-1:873528684822:layer:console:', ]); } @@ -40,10 +40,10 @@ public function test the plugin adds the layers when the runtime is se $output = $this->slsPrint('serverless-runtime-root.yml'); self::assertFunction($output['functions']['function'], [ - 'arn:aws:lambda:us-east-1:534081306603:layer:php-83:', + 'arn:aws:lambda:us-east-1:873528684822:layer:php-83:', ]); self::assertFunction($output['functions']['function-arm'], [ - 'arn:aws:lambda:us-east-1:534081306603:layer:arm-php-83:', + 'arn:aws:lambda:us-east-1:873528684822:layer:arm-php-83:', ]); } @@ -52,21 +52,21 @@ public function test the plugin doesnt break layers added separately(): v $output = $this->slsPrint('serverless-with-layers.yml'); self::assertFunction($output['functions']['function'], [ - 'arn:aws:lambda:us-east-1:534081306603:layer:php-83:', + 'arn:aws:lambda:us-east-1:873528684822:layer:php-83:', 'arn:aws:lambda:us-east-1:1234567890:layer:foo:1', ]); self::assertFunction($output['functions']['function-arm'], [ - 'arn:aws:lambda:us-east-1:534081306603:layer:arm-php-83:', + 'arn:aws:lambda:us-east-1:873528684822:layer:arm-php-83:', 'arn:aws:lambda:us-east-1:1234567890:layer:foo:1', ]); self::assertFunction($output['functions']['function-with-layers'], [ - 'arn:aws:lambda:us-east-1:534081306603:layer:php-83:', + 'arn:aws:lambda:us-east-1:873528684822:layer:php-83:', // This function doesn't have the `foo` layer because that's how SF works: // layers in the function completely override the layers in the root 'arn:aws:lambda:us-east-1:1234567890:layer:bar:1', ]); self::assertFunction($output['functions']['function-arm-with-layers'], [ - 'arn:aws:lambda:us-east-1:534081306603:layer:arm-php-83:', + 'arn:aws:lambda:us-east-1:873528684822:layer:arm-php-83:', // This function doesn't have the `foo` layer because that's how SF works: // layers in the function completely override the layers in the root 'arn:aws:lambda:us-east-1:1234567890:layer:bar:1', @@ -78,21 +78,21 @@ public function test the plugin doesnt break layers added separately wit $output = $this->slsPrint('serverless-runtime-root-with-layers.yml'); self::assertFunction($output['functions']['function'], [ - 'arn:aws:lambda:us-east-1:534081306603:layer:php-83:', + 'arn:aws:lambda:us-east-1:873528684822:layer:php-83:', 'arn:aws:lambda:us-east-1:1234567890:layer:foo:1', ]); self::assertFunction($output['functions']['function-arm'], [ - 'arn:aws:lambda:us-east-1:534081306603:layer:arm-php-83:', + 'arn:aws:lambda:us-east-1:873528684822:layer:arm-php-83:', 'arn:aws:lambda:us-east-1:1234567890:layer:foo:1', ]); self::assertFunction($output['functions']['function-with-layers'], [ - 'arn:aws:lambda:us-east-1:534081306603:layer:php-83:', + 'arn:aws:lambda:us-east-1:873528684822:layer:php-83:', // This function doesn't have the `foo` layer because that's how SF works: // layers in the function completely override the layers in the root 'arn:aws:lambda:us-east-1:1234567890:layer:bar:1', ]); self::assertFunction($output['functions']['function-arm-with-layers'], [ - 'arn:aws:lambda:us-east-1:534081306603:layer:arm-php-83:', + 'arn:aws:lambda:us-east-1:873528684822:layer:arm-php-83:', // This function doesn't have the `foo` layer because that's how SF works: // layers in the function completely override the layers in the root 'arn:aws:lambda:us-east-1:1234567890:layer:bar:1', diff --git a/tests/Sam/template.yaml b/tests/Sam/template.yaml index 7e262270f..c78dcd7c6 100644 --- a/tests/Sam/template.yaml +++ b/tests/Sam/template.yaml @@ -10,7 +10,7 @@ Resources: Handler: tests/Sam/Php/function.php Runtime: provided.al2 Layers: - - 'arn:aws:lambda:us-east-1:534081306603:layer:php-74:18' + - 'arn:aws:lambda:us-east-1:873528684822:layer:php-74:18' Environment: Variables: FOO: bar @@ -23,7 +23,7 @@ Resources: Handler: tests/Sam/PhpFpm/index.php Runtime: provided.al2 Layers: - - 'arn:aws:lambda:us-east-1:534081306603:layer:php-74-fpm:18' + - 'arn:aws:lambda:us-east-1:873528684822:layer:php-74-fpm:18' Events: HttpRoot: Type: Api @@ -42,7 +42,7 @@ Resources: Handler: tests/Sam/PhpFpm/UNKNOWN.php Runtime: provided.al2 Layers: - - 'arn:aws:lambda:us-east-1:534081306603:layer:php-74-fpm:18' + - 'arn:aws:lambda:us-east-1:873528684822:layer:php-74-fpm:18' Events: HttpRoot: Type: Api @@ -58,7 +58,7 @@ Resources: Handler: tests/Sam/Php/psr7.php Runtime: provided.al2 Layers: - - 'arn:aws:lambda:us-east-1:534081306603:layer:php-74:18' + - 'arn:aws:lambda:us-east-1:873528684822:layer:php-74:18' Events: HttpRoot: Type: Api diff --git a/utils/layers.json/update.php b/utils/layers.json/update.php index 3d2412119..74228ca93 100644 --- a/utils/layers.json/update.php +++ b/utils/layers.json/update.php @@ -66,7 +66,7 @@ function lambdaClient(string $region): LambdaClient ]); $credentials = $stsClient->AssumeRole([ - 'RoleArn' => 'arn:aws:iam::534081306603:role/bref-layer-publisher', + 'RoleArn' => 'arn:aws:iam::873528684822:role/bref-layer-publisher', 'RoleSessionName' => 'bref-layer-builder', ]); @@ -90,7 +90,7 @@ function listLayers(LambdaClient $lambda, string $selectedRegion): array foreach (LAYER_NAMES as $layerName) { $results[$layerName] = $lambda->listLayerVersions([ - 'LayerName' => sprintf('arn:aws:lambda:%s:534081306603:layer:%s', $selectedRegion, $layerName), + 'LayerName' => sprintf('arn:aws:lambda:%s:873528684822:layer:%s', $selectedRegion, $layerName), 'MaxItems' => 1, ]); } From 77357cea230f1a8b9f5bc38c20f618b3a0723a0e Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sat, 24 May 2025 22:35:26 +0200 Subject: [PATCH 02/53] Update version --- index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/index.js b/index.js index b0d9ffb69..ae319f57f 100644 --- a/index.js +++ b/index.js @@ -299,7 +299,7 @@ class ServerlessPlugin { const payload = { cli: 'sls', - v: 2, // Bref version + v: 3, // Bref version c: command, ci: ci.isCI, install: userConfig.get('meta.created_at'), From d5f2a8b42a9a46af90c17198148c0fd6f12937b3 Mon Sep 17 00:00:00 2001 From: mnapoli <720328+mnapoli@users.noreply.github.com> Date: Sat, 24 May 2025 21:13:50 +0000 Subject: [PATCH 03/53] Update layer versions --- layers.json | 924 ++++++++++++++++++++++++++-------------------------- 1 file changed, 462 insertions(+), 462 deletions(-) diff --git a/layers.json b/layers.json index 2149d949e..dece215f7 100644 --- a/layers.json +++ b/layers.json @@ -1,506 +1,506 @@ { "php-84": { - "ca-central-1": "22", - "eu-central-1": "22", - "eu-north-1": "22", - "eu-west-1": "22", - "eu-west-2": "22", - "eu-west-3": "22", - "sa-east-1": "22", - "us-east-1": "22", - "us-east-2": "22", - "us-west-1": "22", - "us-west-2": "22", - "ap-east-1": "22", - "ap-south-1": "22", - "ap-northeast-1": "22", - "ap-northeast-2": "22", - "ap-northeast-3": "22", - "ap-southeast-1": "22", - "ap-southeast-2": "22", - "eu-south-1": "22", - "eu-south-2": "22", - "af-south-1": "22", - "me-south-1": "22" + "ca-central-1": "1", + "eu-central-1": "1", + "eu-north-1": "1", + "eu-west-1": "1", + "eu-west-2": "1", + "eu-west-3": "1", + "sa-east-1": "1", + "us-east-1": "1", + "us-east-2": "1", + "us-west-1": "1", + "us-west-2": "1", + "ap-east-1": "1", + "ap-south-1": "1", + "ap-northeast-1": "1", + "ap-northeast-2": "1", + "ap-northeast-3": "1", + "ap-southeast-1": "1", + "ap-southeast-2": "1", + "eu-south-1": "1", + "eu-south-2": "1", + "af-south-1": "1", + "me-south-1": "1" }, "php-84-fpm": { - "ca-central-1": "22", - "eu-central-1": "22", - "eu-north-1": "22", - "eu-west-1": "22", - "eu-west-2": "22", - "eu-west-3": "22", - "sa-east-1": "22", - "us-east-1": "22", - "us-east-2": "22", - "us-west-1": "22", - "us-west-2": "22", - "ap-east-1": "22", - "ap-south-1": "22", - "ap-northeast-1": "22", - "ap-northeast-2": "22", - "ap-northeast-3": "22", - "ap-southeast-1": "22", - "ap-southeast-2": "22", - "eu-south-1": "22", - "eu-south-2": "22", - "af-south-1": "22", - "me-south-1": "22" + "ca-central-1": "", + "eu-central-1": "", + "eu-north-1": "", + "eu-west-1": "", + "eu-west-2": "", + "eu-west-3": "", + "sa-east-1": "", + "us-east-1": "", + "us-east-2": "", + "us-west-1": "", + "us-west-2": "", + "ap-east-1": "", + "ap-south-1": "", + "ap-northeast-1": "", + "ap-northeast-2": "", + "ap-northeast-3": "", + "ap-southeast-1": "", + "ap-southeast-2": "", + "eu-south-1": "", + "eu-south-2": "", + "af-south-1": "", + "me-south-1": "" }, "php-83": { - "ca-central-1": "50", - "eu-central-1": "50", - "eu-north-1": "50", - "eu-west-1": "50", - "eu-west-2": "50", - "eu-west-3": "50", - "sa-east-1": "50", - "us-east-1": "50", - "us-east-2": "50", - "us-west-1": "50", - "us-west-2": "50", - "ap-east-1": "50", - "ap-south-1": "50", - "ap-northeast-1": "50", - "ap-northeast-2": "50", - "ap-northeast-3": "50", - "ap-southeast-1": "50", - "ap-southeast-2": "50", - "eu-south-1": "50", - "eu-south-2": "50", - "af-south-1": "50", - "me-south-1": "50" + "ca-central-1": "1", + "eu-central-1": "1", + "eu-north-1": "1", + "eu-west-1": "1", + "eu-west-2": "1", + "eu-west-3": "1", + "sa-east-1": "1", + "us-east-1": "1", + "us-east-2": "1", + "us-west-1": "1", + "us-west-2": "1", + "ap-east-1": "1", + "ap-south-1": "1", + "ap-northeast-1": "1", + "ap-northeast-2": "1", + "ap-northeast-3": "1", + "ap-southeast-1": "1", + "ap-southeast-2": "1", + "eu-south-1": "1", + "eu-south-2": "1", + "af-south-1": "1", + "me-south-1": "1" }, "php-83-fpm": { - "ca-central-1": "50", - "eu-central-1": "50", - "eu-north-1": "50", - "eu-west-1": "50", - "eu-west-2": "50", - "eu-west-3": "50", - "sa-east-1": "50", - "us-east-1": "50", - "us-east-2": "50", - "us-west-1": "50", - "us-west-2": "50", - "ap-east-1": "50", - "ap-south-1": "50", - "ap-northeast-1": "50", - "ap-northeast-2": "50", - "ap-northeast-3": "50", - "ap-southeast-1": "50", - "ap-southeast-2": "50", - "eu-south-1": "50", - "eu-south-2": "50", - "af-south-1": "50", - "me-south-1": "50" + "ca-central-1": "", + "eu-central-1": "", + "eu-north-1": "", + "eu-west-1": "", + "eu-west-2": "", + "eu-west-3": "", + "sa-east-1": "", + "us-east-1": "", + "us-east-2": "", + "us-west-1": "", + "us-west-2": "", + "ap-east-1": "", + "ap-south-1": "", + "ap-northeast-1": "", + "ap-northeast-2": "", + "ap-northeast-3": "", + "ap-southeast-1": "", + "ap-southeast-2": "", + "eu-south-1": "", + "eu-south-2": "", + "af-south-1": "", + "me-south-1": "" }, "php-82": { - "ca-central-1": "94", - "eu-central-1": "94", - "eu-north-1": "94", - "eu-west-1": "94", - "eu-west-2": "94", - "eu-west-3": "94", - "sa-east-1": "94", - "us-east-1": "94", - "us-east-2": "94", - "us-west-1": "94", - "us-west-2": "94", - "ap-east-1": "94", - "ap-south-1": "94", - "ap-northeast-1": "94", - "ap-northeast-2": "94", - "ap-northeast-3": "94", - "ap-southeast-1": "94", - "ap-southeast-2": "94", - "eu-south-1": "94", - "eu-south-2": "93", - "af-south-1": "94", - "me-south-1": "94" + "ca-central-1": "1", + "eu-central-1": "1", + "eu-north-1": "1", + "eu-west-1": "1", + "eu-west-2": "1", + "eu-west-3": "1", + "sa-east-1": "1", + "us-east-1": "1", + "us-east-2": "1", + "us-west-1": "1", + "us-west-2": "1", + "ap-east-1": "1", + "ap-south-1": "1", + "ap-northeast-1": "1", + "ap-northeast-2": "1", + "ap-northeast-3": "1", + "ap-southeast-1": "1", + "ap-southeast-2": "1", + "eu-south-1": "1", + "eu-south-2": "1", + "af-south-1": "1", + "me-south-1": "1" }, "php-82-fpm": { - "ca-central-1": "94", - "eu-central-1": "94", - "eu-north-1": "94", - "eu-west-1": "94", - "eu-west-2": "94", - "eu-west-3": "94", - "sa-east-1": "94", - "us-east-1": "94", - "us-east-2": "94", - "us-west-1": "94", - "us-west-2": "94", - "ap-east-1": "94", - "ap-south-1": "94", - "ap-northeast-1": "94", - "ap-northeast-2": "94", - "ap-northeast-3": "94", - "ap-southeast-1": "94", - "ap-southeast-2": "94", - "eu-south-1": "94", - "eu-south-2": "93", - "af-south-1": "94", - "me-south-1": "94" + "ca-central-1": "", + "eu-central-1": "", + "eu-north-1": "", + "eu-west-1": "", + "eu-west-2": "", + "eu-west-3": "", + "sa-east-1": "", + "us-east-1": "", + "us-east-2": "", + "us-west-1": "", + "us-west-2": "", + "ap-east-1": "", + "ap-south-1": "", + "ap-northeast-1": "", + "ap-northeast-2": "", + "ap-northeast-3": "", + "ap-southeast-1": "", + "ap-southeast-2": "", + "eu-south-1": "", + "eu-south-2": "", + "af-south-1": "", + "me-south-1": "" }, "php-81": { - "ca-central-1": "105", - "eu-central-1": "105", - "eu-north-1": "105", - "eu-west-1": "105", - "eu-west-2": "105", - "eu-west-3": "105", - "sa-east-1": "105", - "us-east-1": "105", - "us-east-2": "105", - "us-west-1": "105", - "us-west-2": "105", - "ap-east-1": "97", - "ap-south-1": "104", - "ap-northeast-1": "104", - "ap-northeast-2": "104", - "ap-northeast-3": "104", - "ap-southeast-1": "104", - "ap-southeast-2": "104", - "eu-south-1": "97", - "eu-south-2": "94", - "af-south-1": "97", - "me-south-1": "97" + "ca-central-1": "", + "eu-central-1": "", + "eu-north-1": "", + "eu-west-1": "", + "eu-west-2": "", + "eu-west-3": "", + "sa-east-1": "", + "us-east-1": "", + "us-east-2": "", + "us-west-1": "", + "us-west-2": "", + "ap-east-1": "", + "ap-south-1": "", + "ap-northeast-1": "", + "ap-northeast-2": "", + "ap-northeast-3": "", + "ap-southeast-1": "", + "ap-southeast-2": "", + "eu-south-1": "", + "eu-south-2": "", + "af-south-1": "", + "me-south-1": "" }, "php-81-fpm": { - "ca-central-1": "104", - "eu-central-1": "104", - "eu-north-1": "105", - "eu-west-1": "105", - "eu-west-2": "104", - "eu-west-3": "104", - "sa-east-1": "104", - "us-east-1": "105", - "us-east-2": "104", - "us-west-1": "104", - "us-west-2": "105", - "ap-east-1": "97", - "ap-south-1": "103", - "ap-northeast-1": "104", - "ap-northeast-2": "103", - "ap-northeast-3": "103", - "ap-southeast-1": "103", - "ap-southeast-2": "103", - "eu-south-1": "96", - "eu-south-2": "93", - "af-south-1": "96", - "me-south-1": "96" + "ca-central-1": "", + "eu-central-1": "", + "eu-north-1": "", + "eu-west-1": "", + "eu-west-2": "", + "eu-west-3": "", + "sa-east-1": "", + "us-east-1": "", + "us-east-2": "", + "us-west-1": "", + "us-west-2": "", + "ap-east-1": "", + "ap-south-1": "", + "ap-northeast-1": "", + "ap-northeast-2": "", + "ap-northeast-3": "", + "ap-southeast-1": "", + "ap-southeast-2": "", + "eu-south-1": "", + "eu-south-2": "", + "af-south-1": "", + "me-south-1": "" }, "php-80": { - "ca-central-1": "108", - "eu-central-1": "107", - "eu-north-1": "108", - "eu-west-1": "108", - "eu-west-2": "108", - "eu-west-3": "108", - "sa-east-1": "108", - "us-east-1": "108", - "us-east-2": "108", - "us-west-1": "108", - "us-west-2": "108", - "ap-east-1": "98", - "ap-south-1": "107", - "ap-northeast-1": "105", - "ap-northeast-2": "104", - "ap-northeast-3": "105", - "ap-southeast-1": "104", - "ap-southeast-2": "106", - "eu-south-1": "98", - "eu-south-2": "94", - "af-south-1": "98", - "me-south-1": "98" + "ca-central-1": "", + "eu-central-1": "", + "eu-north-1": "", + "eu-west-1": "", + "eu-west-2": "", + "eu-west-3": "", + "sa-east-1": "", + "us-east-1": "", + "us-east-2": "", + "us-west-1": "", + "us-west-2": "", + "ap-east-1": "", + "ap-south-1": "", + "ap-northeast-1": "", + "ap-northeast-2": "", + "ap-northeast-3": "", + "ap-southeast-1": "", + "ap-southeast-2": "", + "eu-south-1": "", + "eu-south-2": "", + "af-south-1": "", + "me-south-1": "" }, "php-80-fpm": { - "ca-central-1": "105", - "eu-central-1": "105", - "eu-north-1": "105", - "eu-west-1": "105", - "eu-west-2": "105", - "eu-west-3": "105", - "sa-east-1": "105", - "us-east-1": "105", - "us-east-2": "105", - "us-west-1": "105", - "us-west-2": "105", - "ap-east-1": "97", - "ap-south-1": "104", - "ap-northeast-1": "104", - "ap-northeast-2": "104", - "ap-northeast-3": "104", - "ap-southeast-1": "104", - "ap-southeast-2": "104", - "eu-south-1": "97", - "eu-south-2": "94", - "af-south-1": "97", - "me-south-1": "97" + "ca-central-1": "", + "eu-central-1": "", + "eu-north-1": "", + "eu-west-1": "", + "eu-west-2": "", + "eu-west-3": "", + "sa-east-1": "", + "us-east-1": "", + "us-east-2": "", + "us-west-1": "", + "us-west-2": "", + "ap-east-1": "", + "ap-south-1": "", + "ap-northeast-1": "", + "ap-northeast-2": "", + "ap-northeast-3": "", + "ap-southeast-1": "", + "ap-southeast-2": "", + "eu-south-1": "", + "eu-south-2": "", + "af-south-1": "", + "me-south-1": "" }, "arm-php-84": { - "ca-central-1": "22", - "eu-central-1": "22", - "eu-north-1": "22", - "eu-west-1": "22", - "eu-west-2": "22", - "eu-west-3": "22", - "sa-east-1": "22", - "us-east-1": "22", - "us-east-2": "22", - "us-west-1": "22", - "us-west-2": "22", - "ap-east-1": "22", - "ap-south-1": "22", - "ap-northeast-1": "22", - "ap-northeast-2": "22", - "ap-northeast-3": "22", - "ap-southeast-1": "22", - "ap-southeast-2": "22", - "eu-south-1": "22", - "eu-south-2": "22", - "af-south-1": "22", - "me-south-1": "22" + "ca-central-1": "1", + "eu-central-1": "1", + "eu-north-1": "1", + "eu-west-1": "1", + "eu-west-2": "1", + "eu-west-3": "1", + "sa-east-1": "1", + "us-east-1": "1", + "us-east-2": "1", + "us-west-1": "1", + "us-west-2": "1", + "ap-east-1": "1", + "ap-south-1": "1", + "ap-northeast-1": "1", + "ap-northeast-2": "1", + "ap-northeast-3": "1", + "ap-southeast-1": "1", + "ap-southeast-2": "1", + "eu-south-1": "1", + "eu-south-2": "1", + "af-south-1": "1", + "me-south-1": "1" }, "arm-php-84-fpm": { - "ca-central-1": "22", - "eu-central-1": "22", - "eu-north-1": "22", - "eu-west-1": "22", - "eu-west-2": "22", - "eu-west-3": "22", - "sa-east-1": "22", - "us-east-1": "22", - "us-east-2": "22", - "us-west-1": "22", - "us-west-2": "22", - "ap-east-1": "22", - "ap-south-1": "22", - "ap-northeast-1": "22", - "ap-northeast-2": "22", - "ap-northeast-3": "22", - "ap-southeast-1": "22", - "ap-southeast-2": "22", - "eu-south-1": "22", - "eu-south-2": "22", - "af-south-1": "22", - "me-south-1": "22" + "ca-central-1": "", + "eu-central-1": "", + "eu-north-1": "", + "eu-west-1": "", + "eu-west-2": "", + "eu-west-3": "", + "sa-east-1": "", + "us-east-1": "", + "us-east-2": "", + "us-west-1": "", + "us-west-2": "", + "ap-east-1": "", + "ap-south-1": "", + "ap-northeast-1": "", + "ap-northeast-2": "", + "ap-northeast-3": "", + "ap-southeast-1": "", + "ap-southeast-2": "", + "eu-south-1": "", + "eu-south-2": "", + "af-south-1": "", + "me-south-1": "" }, "arm-php-83": { - "ca-central-1": "50", - "eu-central-1": "50", - "eu-north-1": "50", - "eu-west-1": "50", - "eu-west-2": "50", - "eu-west-3": "50", - "sa-east-1": "50", - "us-east-1": "50", - "us-east-2": "50", - "us-west-1": "50", - "us-west-2": "50", - "ap-east-1": "50", - "ap-south-1": "50", - "ap-northeast-1": "50", - "ap-northeast-2": "50", - "ap-northeast-3": "50", - "ap-southeast-1": "50", - "ap-southeast-2": "50", - "eu-south-1": "50", - "eu-south-2": "50", - "af-south-1": "50", - "me-south-1": "50" + "ca-central-1": "1", + "eu-central-1": "1", + "eu-north-1": "1", + "eu-west-1": "1", + "eu-west-2": "1", + "eu-west-3": "1", + "sa-east-1": "1", + "us-east-1": "1", + "us-east-2": "1", + "us-west-1": "1", + "us-west-2": "1", + "ap-east-1": "1", + "ap-south-1": "1", + "ap-northeast-1": "1", + "ap-northeast-2": "1", + "ap-northeast-3": "1", + "ap-southeast-1": "1", + "ap-southeast-2": "1", + "eu-south-1": "1", + "eu-south-2": "1", + "af-south-1": "1", + "me-south-1": "1" }, "arm-php-83-fpm": { - "ca-central-1": "49", - "eu-central-1": "49", - "eu-north-1": "49", - "eu-west-1": "49", - "eu-west-2": "49", - "eu-west-3": "49", - "sa-east-1": "49", - "us-east-1": "50", - "us-east-2": "49", - "us-west-1": "49", - "us-west-2": "49", - "ap-east-1": "49", - "ap-south-1": "49", - "ap-northeast-1": "49", - "ap-northeast-2": "49", - "ap-northeast-3": "49", - "ap-southeast-1": "49", - "ap-southeast-2": "49", - "eu-south-1": "49", - "eu-south-2": "49", - "af-south-1": "49", - "me-south-1": "49" + "ca-central-1": "", + "eu-central-1": "", + "eu-north-1": "", + "eu-west-1": "", + "eu-west-2": "", + "eu-west-3": "", + "sa-east-1": "", + "us-east-1": "", + "us-east-2": "", + "us-west-1": "", + "us-west-2": "", + "ap-east-1": "", + "ap-south-1": "", + "ap-northeast-1": "", + "ap-northeast-2": "", + "ap-northeast-3": "", + "ap-southeast-1": "", + "ap-southeast-2": "", + "eu-south-1": "", + "eu-south-2": "", + "af-south-1": "", + "me-south-1": "" }, "arm-php-82": { - "ca-central-1": "82", - "eu-central-1": "82", - "eu-north-1": "82", - "eu-west-1": "82", - "eu-west-2": "82", - "eu-west-3": "82", - "sa-east-1": "82", - "us-east-1": "82", - "us-east-2": "82", - "us-west-1": "82", - "us-west-2": "82", - "ap-east-1": "82", - "ap-south-1": "82", - "ap-northeast-1": "82", - "ap-northeast-2": "82", - "ap-northeast-3": "82", - "ap-southeast-1": "82", - "ap-southeast-2": "82", - "eu-south-1": "82", - "eu-south-2": "82", - "af-south-1": "82", - "me-south-1": "82" + "ca-central-1": "1", + "eu-central-1": "1", + "eu-north-1": "1", + "eu-west-1": "1", + "eu-west-2": "1", + "eu-west-3": "1", + "sa-east-1": "1", + "us-east-1": "1", + "us-east-2": "1", + "us-west-1": "1", + "us-west-2": "1", + "ap-east-1": "1", + "ap-south-1": "1", + "ap-northeast-1": "1", + "ap-northeast-2": "1", + "ap-northeast-3": "1", + "ap-southeast-1": "1", + "ap-southeast-2": "1", + "eu-south-1": "1", + "eu-south-2": "1", + "af-south-1": "1", + "me-south-1": "1" }, "arm-php-82-fpm": { - "ca-central-1": "82", - "eu-central-1": "82", - "eu-north-1": "82", - "eu-west-1": "82", - "eu-west-2": "82", - "eu-west-3": "82", - "sa-east-1": "82", - "us-east-1": "82", - "us-east-2": "82", - "us-west-1": "82", - "us-west-2": "82", - "ap-east-1": "82", - "ap-south-1": "82", - "ap-northeast-1": "82", - "ap-northeast-2": "82", - "ap-northeast-3": "82", - "ap-southeast-1": "82", - "ap-southeast-2": "82", - "eu-south-1": "82", - "eu-south-2": "82", - "af-south-1": "82", - "me-south-1": "82" + "ca-central-1": "", + "eu-central-1": "", + "eu-north-1": "", + "eu-west-1": "", + "eu-west-2": "", + "eu-west-3": "", + "sa-east-1": "", + "us-east-1": "", + "us-east-2": "", + "us-west-1": "", + "us-west-2": "", + "ap-east-1": "", + "ap-south-1": "", + "ap-northeast-1": "", + "ap-northeast-2": "", + "ap-northeast-3": "", + "ap-southeast-1": "", + "ap-southeast-2": "", + "eu-south-1": "", + "eu-south-2": "", + "af-south-1": "", + "me-south-1": "" }, "arm-php-81": { - "ca-central-1": "85", - "eu-central-1": "85", - "eu-north-1": "85", - "eu-west-1": "85", - "eu-west-2": "85", - "eu-west-3": "85", - "sa-east-1": "85", - "us-east-1": "85", - "us-east-2": "85", - "us-west-1": "85", - "us-west-2": "85", - "ap-east-1": "85", - "ap-south-1": "85", - "ap-northeast-1": "85", - "ap-northeast-2": "85", - "ap-northeast-3": "85", - "ap-southeast-1": "85", - "ap-southeast-2": "85", - "eu-south-1": "85", - "eu-south-2": "85", - "af-south-1": "85", - "me-south-1": "85" + "ca-central-1": "", + "eu-central-1": "", + "eu-north-1": "", + "eu-west-1": "", + "eu-west-2": "", + "eu-west-3": "", + "sa-east-1": "", + "us-east-1": "", + "us-east-2": "", + "us-west-1": "", + "us-west-2": "", + "ap-east-1": "", + "ap-south-1": "", + "ap-northeast-1": "", + "ap-northeast-2": "", + "ap-northeast-3": "", + "ap-southeast-1": "", + "ap-southeast-2": "", + "eu-south-1": "", + "eu-south-2": "", + "af-south-1": "", + "me-south-1": "" }, "arm-php-81-fpm": { - "ca-central-1": "85", - "eu-central-1": "85", - "eu-north-1": "85", - "eu-west-1": "85", - "eu-west-2": "85", - "eu-west-3": "85", - "sa-east-1": "85", - "us-east-1": "85", - "us-east-2": "85", - "us-west-1": "85", - "us-west-2": "85", - "ap-east-1": "85", - "ap-south-1": "85", - "ap-northeast-1": "85", - "ap-northeast-2": "85", - "ap-northeast-3": "85", - "ap-southeast-1": "85", - "ap-southeast-2": "85", - "eu-south-1": "85", - "eu-south-2": "85", - "af-south-1": "85", - "me-south-1": "85" + "ca-central-1": "", + "eu-central-1": "", + "eu-north-1": "", + "eu-west-1": "", + "eu-west-2": "", + "eu-west-3": "", + "sa-east-1": "", + "us-east-1": "", + "us-east-2": "", + "us-west-1": "", + "us-west-2": "", + "ap-east-1": "", + "ap-south-1": "", + "ap-northeast-1": "", + "ap-northeast-2": "", + "ap-northeast-3": "", + "ap-southeast-1": "", + "ap-southeast-2": "", + "eu-south-1": "", + "eu-south-2": "", + "af-south-1": "", + "me-south-1": "" }, "arm-php-80": { - "ca-central-1": "107", - "eu-central-1": "106", - "eu-north-1": "107", - "eu-west-1": "107", - "eu-west-2": "107", - "eu-west-3": "107", - "sa-east-1": "107", - "us-east-1": "107", - "us-east-2": "107", - "us-west-1": "107", - "us-west-2": "107", - "ap-east-1": "99", - "ap-south-1": "106", - "ap-northeast-1": "106", - "ap-northeast-2": "106", - "ap-northeast-3": "106", - "ap-southeast-1": "106", - "ap-southeast-2": "106", - "eu-south-1": "99", - "eu-south-2": "95", - "af-south-1": "99", - "me-south-1": "99" + "ca-central-1": "", + "eu-central-1": "", + "eu-north-1": "", + "eu-west-1": "", + "eu-west-2": "", + "eu-west-3": "", + "sa-east-1": "", + "us-east-1": "", + "us-east-2": "", + "us-west-1": "", + "us-west-2": "", + "ap-east-1": "", + "ap-south-1": "", + "ap-northeast-1": "", + "ap-northeast-2": "", + "ap-northeast-3": "", + "ap-southeast-1": "", + "ap-southeast-2": "", + "eu-south-1": "", + "eu-south-2": "", + "af-south-1": "", + "me-south-1": "" }, "arm-php-80-fpm": { - "ca-central-1": "106", - "eu-central-1": "105", - "eu-north-1": "106", - "eu-west-1": "106", - "eu-west-2": "105", - "eu-west-3": "105", - "sa-east-1": "105", - "us-east-1": "106", - "us-east-2": "106", - "us-west-1": "105", - "us-west-2": "106", - "ap-east-1": "98", - "ap-south-1": "104", - "ap-northeast-1": "105", - "ap-northeast-2": "104", - "ap-northeast-3": "104", - "ap-southeast-1": "104", - "ap-southeast-2": "104", - "eu-south-1": "97", - "eu-south-2": "94", - "af-south-1": "98", - "me-south-1": "97" + "ca-central-1": "", + "eu-central-1": "", + "eu-north-1": "", + "eu-west-1": "", + "eu-west-2": "", + "eu-west-3": "", + "sa-east-1": "", + "us-east-1": "", + "us-east-2": "", + "us-west-1": "", + "us-west-2": "", + "ap-east-1": "", + "ap-south-1": "", + "ap-northeast-1": "", + "ap-northeast-2": "", + "ap-northeast-3": "", + "ap-southeast-1": "", + "ap-southeast-2": "", + "eu-south-1": "", + "eu-south-2": "", + "af-south-1": "", + "me-south-1": "" }, "console": { - "ca-central-1": "103", - "eu-central-1": "103", - "eu-north-1": "103", - "eu-west-1": "103", - "eu-west-2": "103", - "eu-west-3": "103", - "sa-east-1": "103", - "us-east-1": "103", - "us-east-2": "103", - "us-west-1": "103", - "us-west-2": "103", - "ap-east-1": "95", - "ap-south-1": "102", - "ap-northeast-1": "102", - "ap-northeast-2": "102", - "ap-northeast-3": "102", - "ap-southeast-1": "102", - "ap-southeast-2": "102", - "eu-south-1": "95", - "eu-south-2": "92", - "af-south-1": "95", - "me-south-1": "95" + "ca-central-1": "", + "eu-central-1": "", + "eu-north-1": "", + "eu-west-1": "", + "eu-west-2": "", + "eu-west-3": "", + "sa-east-1": "", + "us-east-1": "", + "us-east-2": "", + "us-west-1": "", + "us-west-2": "", + "ap-east-1": "", + "ap-south-1": "", + "ap-northeast-1": "", + "ap-northeast-2": "", + "ap-northeast-3": "", + "ap-southeast-1": "", + "ap-southeast-2": "", + "eu-south-1": "", + "eu-south-2": "", + "af-south-1": "", + "me-south-1": "" } } \ No newline at end of file From c7b96288dd3791d9f5d21dfcb169b5c3379e56e0 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sat, 24 May 2025 23:21:07 +0200 Subject: [PATCH 04/53] Add ap-southeast-3 and me-central-1 regions --- utils/layers.json/regions.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/utils/layers.json/regions.json b/utils/layers.json/regions.json index 5940d586c..0d0d125b3 100644 --- a/utils/layers.json/regions.json +++ b/utils/layers.json/regions.json @@ -17,8 +17,10 @@ "ap-northeast-3", "ap-southeast-1", "ap-southeast-2", + "ap-southeast-3", "eu-south-1", "eu-south-2", "af-south-1", - "me-south-1" + "me-south-1", + "me-central-1" ] From 650155baa98ed109ebc0b8ce20e0794166375d5b Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sat, 24 May 2025 23:42:33 +0200 Subject: [PATCH 05/53] Remove support for PHP 8.0 and 8.1 in Bref v3 (#1954) --- .github/workflows/ci.yml | 4 +- composer.json | 2 +- docs/default/cli-commands.mdx | 2 +- docs/default/getting-started.mdx | 2 +- docs/deploy/docker.mdx | 16 +++---- docs/environment/php.mdx | 2 +- docs/environment/serverless-yml.mdx | 12 ++--- docs/laravel/octane.mdx | 4 +- docs/laravel/queues.mdx | 2 +- docs/local-development.mdx | 2 +- .../event-driven-functions.mdx | 8 ++-- docs/monitoring.md | 4 +- docs/runtimes.mdx | 44 +++++++------------ docs/runtimes/console.mdx | 6 +-- docs/runtimes/fpm-runtime.mdx | 2 +- docs/runtimes/function.mdx | 2 +- docs/runtimes/runtimes-details.mdx | 6 +-- docs/setup.mdx | 4 +- docs/symfony/keep-alive.mdx | 4 +- docs/symfony/messenger.mdx | 6 +-- docs/upgrading/v2.md | 6 +-- docs/upgrading/v3.md | 4 ++ docs/use-cases/cron.mdx | 18 ++++---- docs/use-cases/http.mdx | 4 +- docs/use-cases/http/advanced-use-cases.mdx | 10 ++--- index.js | 2 +- tests/FpmRuntime/FpmHandlerTest.php | 6 --- utils/layers.json/update.php | 8 ---- website/src/pages/news/02-bref-2.0.mdx | 20 ++++----- 29 files changed, 96 insertions(+), 116 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1fc087179..be146c2cd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,11 +16,11 @@ jobs: timeout-minutes: 15 strategy: matrix: - php: [ '8.4', '8.3', '8.2', '8.1', '8.0' ] + php: [ '8.4', '8.3', '8.2' ] dependency-version: [ '' ] platform-reqs: [ '' ] include: - - php: '8.0' + - php: '8.2' dependency-version: '--prefer-lowest' steps: - name: Checkout diff --git a/composer.json b/composer.json index 9b407da22..f8d7d7cac 100644 --- a/composer.json +++ b/composer.json @@ -20,7 +20,7 @@ "src/bref-local" ], "require": { - "php": ">=8.0", + "php": ">=8.2", "ext-curl": "*", "ext-json": "*", "crwlr/query-string": "^1.0.3", diff --git a/docs/default/cli-commands.mdx b/docs/default/cli-commands.mdx index db8b8dc24..a4741e69e 100644 --- a/docs/default/cli-commands.mdx +++ b/docs/default/cli-commands.mdx @@ -6,7 +6,7 @@ We can run CLI commands and scripts on AWS Lambda by deploying a "console" funct functions: cli: handler: the-php-script-to-run.php - runtime: php-81-console + runtime: php-84-console ``` The function uses the [Console runtime](../runtimes/console.mdx). diff --git a/docs/default/getting-started.mdx b/docs/default/getting-started.mdx index 2948c498c..978506353 100644 --- a/docs/default/getting-started.mdx +++ b/docs/default/getting-started.mdx @@ -53,7 +53,7 @@ provider: functions: web: handler: index.php - runtime: php-81-fpm + runtime: php-84-fpm events: - httpApi: '*' diff --git a/docs/deploy/docker.mdx b/docs/deploy/docker.mdx index 295a962f4..8d2035a30 100644 --- a/docs/deploy/docker.mdx +++ b/docs/deploy/docker.mdx @@ -29,7 +29,7 @@ You should consider deploying using Docker when: Bref helps you deploy using Docker images by offering base images that work on AWS Lambda. Here is an example of a Dockerfile you can use: ```dockerfile filename="Dockerfile" -FROM bref/php-81-fpm:2 +FROM bref/php-84-fpm:2 # Copy the source code in the image COPY . /var/task @@ -43,14 +43,14 @@ The `CMD` instruction let us specify the entrypoint that will handle all request Always specify the major version of the Bref image you want to use. That avoids breaking changes when a new major version is released. - For example `bref/php-81-fpm:2` points to Bref v2. + For example `bref/php-84-fpm:3` points to Bref v3. Bref offers the following base images: -- `bref/php-xx-fpm:2`: PHP-FPM to run HTTP applications -- `bref/php-xx-console:2`: to run PHP CLI commands -- `bref/php-xx:2`: to run [PHP functions](../runtimes/function.mdx) +- `bref/php-xx-fpm:3`: PHP-FPM to run HTTP applications +- `bref/php-xx-console:3`: to run PHP CLI commands +- `bref/php-xx:3`: to run [PHP functions](../runtimes/function.mdx) The `CMD` instruction in `Dockerfile` must contain a valid JSON array. This is why you must escape any `\` character. This is important for PHP class names, for example when using Laravel Octane: @@ -65,10 +65,10 @@ Bref offers the following base images: You can enable additional PHP extensions by pulling them from [Bref Extra Extensions](https://github.com/brefphp/extra-php-extensions): ```dockerfile filename="Dockerfile" {3-4} -FROM bref/php-81-fpm:2 +FROM bref/php-84-fpm:2 -COPY --from=bref/extra-redis-php-81:1 /opt /opt -COPY --from=bref/extra-gmp-php-81:1 /opt /opt +COPY --from=bref/extra-redis-php-84:1 /opt /opt +COPY --from=bref/extra-gmp-php-84:1 /opt /opt COPY . /var/task diff --git a/docs/environment/php.mdx b/docs/environment/php.mdx index fabb6b2ad..035a8aaec 100644 --- a/docs/environment/php.mdx +++ b/docs/environment/php.mdx @@ -133,7 +133,7 @@ To create your custom layer, you will need to: To compile the extension, Bref provides the `bref/build-php-*` Docker images. Here is an example with Blackfire: ```dockerfile -FROM bref/build-php-80:2 +FROM bref/build-php-84:2 RUN curl -A "Docker" -o /tmp/blackfire.so -L -s "https://packages.blackfire.io/binaries/blackfire-php/1.42.0/blackfire-php-linux_amd64-php-74.so" diff --git a/docs/environment/serverless-yml.mdx b/docs/environment/serverless-yml.mdx index 3337b5af1..d8530cb22 100644 --- a/docs/environment/serverless-yml.mdx +++ b/docs/environment/serverless-yml.mdx @@ -22,7 +22,7 @@ plugins: functions: foo: handler: index.php - runtime: php-81 + runtime: php-84 resources: Resources: @@ -65,7 +65,7 @@ The `provider` section also lets us configure global options on all functions: ```yaml provider: name: aws - runtime: php-81 + runtime: php-84 timeout: 10 functions: @@ -86,11 +86,11 @@ provider: functions: foo: handler: foo.php - runtime: php-81 + runtime: php-84 timeout: 10 bar: handler: bar.php - runtime: php-81 + runtime: php-84 timeout: 10 # ... @@ -136,10 +136,10 @@ Read more about the `package` configuration [in the serverless.yml documentation functions: foo: handler: foo.php - runtime: php-81 + runtime: php-84 bar: handler: bar.php - runtime: php-81 + runtime: php-84 ``` Functions are AWS Lambda functions. You can find all options available [in this Serverless documentation page](https://serverless.com/framework/docs/providers/aws/guide/functions/). diff --git a/docs/laravel/octane.mdx b/docs/laravel/octane.mdx index 5c83008c5..89e71368d 100644 --- a/docs/laravel/octane.mdx +++ b/docs/laravel/octane.mdx @@ -11,7 +11,7 @@ To run the HTTP application with [Laravel Octane](https://laravel.com/docs/10.x/ functions: web: handler: Bref\LaravelBridge\Http\OctaneHandler - runtime: php-81 + runtime: php-84 environment: BREF_LOOP_MAX: 250 # ... @@ -40,7 +40,7 @@ You can keep database connections persistent across requests to make your applic functions: web: handler: Bref\LaravelBridge\Http\OctaneHandler - runtime: php-81 + runtime: php-84 environment: BREF_LOOP_MAX: 250 OCTANE_PERSIST_DATABASE_SESSIONS: 1 diff --git a/docs/laravel/queues.mdx b/docs/laravel/queues.mdx index 098882689..480fc41fb 100644 --- a/docs/laravel/queues.mdx +++ b/docs/laravel/queues.mdx @@ -39,7 +39,7 @@ constructs: type: queue worker: handler: Bref\LaravelBridge\Queue\QueueHandler - runtime: php-81 + runtime: php-84 timeout: 60 # seconds ``` diff --git a/docs/local-development.mdx b/docs/local-development.mdx index ceacbf6a0..b5af0d95c 100644 --- a/docs/local-development.mdx +++ b/docs/local-development.mdx @@ -42,7 +42,7 @@ version: "3.5" services: app: - image: bref/php-81-fpm-dev:2 + image: bref/php-84-fpm-dev:3 ports: [ '8000:8000' ] volumes: - .:/var/task diff --git a/docs/local-development/event-driven-functions.mdx b/docs/local-development/event-driven-functions.mdx index d7464c3ef..f7debd20a 100644 --- a/docs/local-development/event-driven-functions.mdx +++ b/docs/local-development/event-driven-functions.mdx @@ -30,7 +30,7 @@ return function (array $event) { functions: hello: handler: my-function.php - runtime: php-81 + runtime: php-84 ``` You can invoke it with or without event data: @@ -86,10 +86,10 @@ Hello Alex If you want to run your function in Docker: ```bash -$ docker run --rm -it --entrypoint= -v $(PWD):/var/task:ro bref/php-81:2 vendor/bin/bref-local my-function.php +$ docker run --rm -it --entrypoint= -v $(PWD):/var/task:ro bref/php-84:3 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 +$ docker run --rm -it -v $(PWD):/var/task:ro bref/php-84-fpm-dev:3 vendor/bin/bref-local my-function.php ``` You can also use Docker Compose, like described in [Local development for HTTP applications](../local-development.mdx): @@ -98,7 +98,7 @@ You can also use Docker Compose, like described in [Local development for HTTP a version: "3.5" services: app: - image: bref/php-81-fpm-dev:2 + image: bref/php-84-fpm-dev:3 volumes: - .:/var/task ``` diff --git a/docs/monitoring.md b/docs/monitoring.md index cb6675cff..ea4ab143e 100644 --- a/docs/monitoring.md +++ b/docs/monitoring.md @@ -91,9 +91,9 @@ functions: my-function: handler: index.php layers: - - ${bref:layer.php-81-fpm} + - ${bref:layer.php-84-fpm} # Add this line: - - ${bref-extra:tideways-php-81} + - ${bref-extra:tideways-php-84} ``` > Make sure to use the same PHP version as the one for the PHP layer. diff --git a/docs/runtimes.mdx b/docs/runtimes.mdx index 57606091e..552a4004d 100644 --- a/docs/runtimes.mdx +++ b/docs/runtimes.mdx @@ -23,7 +23,7 @@ The runtimes are available as AWS Lambda layers that you can use (explained belo ### PHP-FPM runtime for web apps -Name: `php-83-fpm`, `php-82-fpm`, `php-81-fpm`, and `php-80-fpm`. +Name: `php-84-fpm`, `php-83-fpm`, and `php-82-fpm`. This runtime uses PHP-FPM to run **web applications** on AWS Lambda, like on a traditional server. @@ -33,7 +33,7 @@ It's **the easiest to start with**: it works like traditional PHP hosting and is ### Event-driven functions -Name: `php-83`, `php-82`, `php-81`, and `php-80`. +Name: `php-84`, `php-83`, and `php-82`. AWS Lambda was initially created to run _functions_ (yes, functions of code) in the cloud. @@ -49,7 +49,7 @@ This runtime works great to create **event-driven micro-services**. ### Console -Name: `php-83-console`, `php-82-console`, `php-81-console`, and `php-80-console`. +Name: `php-84-console`, `php-83-console`, and `php-82-console`. This runtime lets you run CLI console commands on Lambda. @@ -70,32 +70,25 @@ plugins: functions: hello: # ... - runtime: php-81 + runtime: php-84 # or: - runtime: php-81-fpm + runtime: php-84-fpm # or: - runtime: php-81-console + runtime: php-84-console ``` -Bref currently provides runtimes for PHP 8.0, 8.1, 8.2 and 8.3: +Bref currently provides runtimes for PHP 8.2, 8.3, and 8.4: +- `php-84` - `php-83` - `php-82` -- `php-81` -- `php-80` - `php-83-fpm` - `php-82-fpm` -- `php-81-fpm` -- `php-80-fpm` - `php-83-console` - `php-82-console` -- `php-81-console` -- `php-80-console` - -Bref also provides runtimes for alpha versions of PHP 8.4. - `php-80` means PHP 8.0.\*. It is not possible to require a specific "patch" version. The latest Bref versions always aim to support the latest PHP versions, so upgrade via Composer frequently to keep PHP up to date. + `php-84` means PHP 8.4.\*. It is not possible to require a specific "patch" version. The latest Bref versions always aim to support the latest PHP versions, so upgrade via Composer frequently to keep PHP up to date. ### The Bref plugin for serverless.yml @@ -107,7 +100,7 @@ plugins: - ./vendor/bref/bref ``` -This plugin is what makes `runtime: php-81` work (as well as other utilities). It is explained in more details in the section below. +This plugin is what makes `runtime: php-84` work (as well as other utilities). It is explained in more details in the section below. ### ARM runtimes @@ -119,7 +112,7 @@ You can deploy to ARM by using the `arm64` architecture: functions: api: handler: public/index.php - runtime: php-81-fpm + runtime: php-84-fpm + architecture: arm64 ``` @@ -139,7 +132,7 @@ What the Bref plugin for `serverless.yml` (the one we include with `./vendor/bre functions: hello: # ... - runtime: php-81 + runtime: php-84 ``` into this: @@ -150,14 +143,14 @@ functions: # ... runtime: provided.al2 layers: - - 'arn:aws:lambda:us-east-1:873528684822:layer:php-81:21' + - 'arn:aws:lambda:us-east-1:873528684822:layer:php-84:21' ``` ☝️ `provided.al2` [is the generic Linux environment for custom runtimes](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html#runtimes-custom-use), and the `layers` config points to Bref's AWS Lambda layers. Thanks to the Bref plugin, our `serverless.yml` is simpler. It also automatically adapts to the AWS region in use, and automatically points to the correct layer version. You can learn more about "layers" [in this page](./runtimes/runtimes-details.mdx). -If you want to reference AWS Lambda layers directly (instead of using the simpler `runtime: php-81` syntax), the Bref plugin also provides simple `serverless.yml` variables. These were the default in Bref v1.x, so you may find this older syntax on tutorials and blog posts: +If you want to reference AWS Lambda layers directly (instead of using the simpler `runtime: php-84` syntax), the Bref plugin also provides simple `serverless.yml` variables. These were the default in Bref v1.x, so you may find this older syntax on tutorials and blog posts: ```yaml service: app @@ -170,21 +163,18 @@ functions: hello: # ... layers: - - ${bref:layer.php-81} + - ${bref:layer.php-84} # or: - - ${bref:layer.php-81-fpm} + - ${bref:layer.php-84-fpm} ``` The `${...}` notation is the [syntax to use variables](https://serverless.com/framework/docs/providers/aws/guide/variables/) in `serverless.yml`. The Bref plugin provides the following variables: +- `${bref:layer.php-84}` - `${bref:layer.php-83}` - `${bref:layer.php-82}` -- `${bref:layer.php-81}` -- `${bref:layer.php-80}` - `${bref:layer.php-83-fpm}` - `${bref:layer.php-82-fpm}` -- `${bref:layer.php-81-fpm}` -- `${bref:layer.php-80-fpm}` - `${bref:layer.console}` Bref ARM layers are the same as the x86 layers, but with the `arm-` prefix in their name, for example `${bref:layer.arm-php-82}`. The only exception is `${bref:layer.console}` (this is the same layer for both x86 and ARM). diff --git a/docs/runtimes/console.mdx b/docs/runtimes/console.mdx index 1a9abbf8e..e6cea488f 100644 --- a/docs/runtimes/console.mdx +++ b/docs/runtimes/console.mdx @@ -33,10 +33,10 @@ plugins: functions: hello: handler: the-php-script-to-run.php - runtime: php-81-console + runtime: php-84-console ``` -Behind the scenes, the `php-xx-console` runtime will deploy a Lambda function configured to use Bref's `php-81` AWS Lambda layer plus Bref's `console` layer (read more about these in the [runtimes documentation](../runtimes.mdx)). +Behind the scenes, the `php-xx-console` runtime will deploy a Lambda function configured to use Bref's `php-84` AWS Lambda layer plus Bref's `console` layer (read more about these in the [runtimes documentation](../runtimes.mdx)). ## Running commands @@ -46,7 +46,7 @@ When invoked, the "Console" runtime executes the `handler` script in a sub-proce functions: hello: handler: the-php-script-to-run.php - runtime: php-81-console + runtime: php-84-console ``` Then the following command would run in Lambda every time the function is invoked: diff --git a/docs/runtimes/fpm-runtime.mdx b/docs/runtimes/fpm-runtime.mdx index 9765f30b7..c17a7a039 100644 --- a/docs/runtimes/fpm-runtime.mdx +++ b/docs/runtimes/fpm-runtime.mdx @@ -38,7 +38,7 @@ plugins: functions: app: handler: index.php - runtime: php-81-fpm + runtime: php-84-fpm events: - httpApi: '*' ``` diff --git a/docs/runtimes/function.mdx b/docs/runtimes/function.mdx index 3f6e73d15..230137dfc 100644 --- a/docs/runtimes/function.mdx +++ b/docs/runtimes/function.mdx @@ -49,7 +49,7 @@ plugins: functions: hello: handler: my-function.php - runtime: php-81 + runtime: php-84 ``` ## PHP functions diff --git a/docs/runtimes/runtimes-details.mdx b/docs/runtimes/runtimes-details.mdx index 9e6e940cd..5230fb3dd 100644 --- a/docs/runtimes/runtimes-details.mdx +++ b/docs/runtimes/runtimes-details.mdx @@ -20,7 +20,7 @@ arn:aws:lambda::873528684822:layer:: For example: ``` -arn:aws:lambda:us-east-1:873528684822:layer:php-80:21 +arn:aws:lambda:us-east-1:873528684822:layer:php-84:21 ``` You can use layers via their full ARN, for example in `serverless.yml`: @@ -34,7 +34,7 @@ functions: # ... runtime: provided.al2 layers: - - 'arn:aws:lambda:us-east-1:873528684822:layer:php-80:21' + - 'arn:aws:lambda:us-east-1:873528684822:layer:php-84:21' ``` Or if you are using [SAM's `template.yaml`](https://aws.amazon.com/serverless/sam/): @@ -49,7 +49,7 @@ Resources: # ... Runtime: provided.al2 Layers: - - 'arn:aws:lambda:us-east-1:873528684822:layer:php-80:21' + - 'arn:aws:lambda:us-east-1:873528684822:layer:php-84:21' ``` Bref layers work with AWS Lambda regardless of the tool you use to deploy your application: Serverless, SAM, CloudFormation, Terraform, AWS CDK, etc. diff --git a/docs/setup.mdx b/docs/setup.mdx index bf52474aa..9341bf63d 100644 --- a/docs/setup.mdx +++ b/docs/setup.mdx @@ -68,6 +68,6 @@ That's it, you're ready to use Bref! - Bref is compatible with PHP 8.0 or greater. - If you are using PHP 7.4, Bref v1 (previous major version) will be installed instead. + Bref is compatible with PHP 8.2 or greater. + If you are using PHP 8.0 or 8.1, Bref v2 (previous major version) will be installed instead. diff --git a/docs/symfony/keep-alive.mdx b/docs/symfony/keep-alive.mdx index 0de6636b2..9e2fed588 100644 --- a/docs/symfony/keep-alive.mdx +++ b/docs/symfony/keep-alive.mdx @@ -19,8 +19,8 @@ functions: + handler: App\Kernel layers: # Switch from PHP-FPM to the "function" runtime: -- - ${bref:layer.php-81-fpm} -+ - ${bref:layer.php-81} +- - ${bref:layer.php-84-fpm} ++ - ${bref:layer.php-84} environment: + # The Symfony process will restart every 100 requests + BREF_LOOP_MAX: 100 diff --git a/docs/symfony/messenger.mdx b/docs/symfony/messenger.mdx index dbbf87972..11675f9f6 100644 --- a/docs/symfony/messenger.mdx +++ b/docs/symfony/messenger.mdx @@ -84,7 +84,7 @@ constructs: type: queue worker: handler: bin/consumer.php - runtime: php-81 + runtime: php-84 timeout: 60 # in seconds ``` @@ -193,7 +193,7 @@ functions: worker: handler: bin/consumer.php timeout: 20 # in seconds - runtime: php-81 + runtime: php-84 events: # Read more at https://www.serverless.com/framework/docs/providers/aws/events/sns/ - sns: @@ -269,7 +269,7 @@ functions: worker: handler: bin/consumer.php timeout: 20 # in seconds - runtime: php-81 + runtime: php-84 events: # Read more at https://www.serverless.com/framework/docs/providers/aws/events/event-bridge/ - eventBridge: diff --git a/docs/upgrading/v2.md b/docs/upgrading/v2.md index 042394853..34acf9c7f 100644 --- a/docs/upgrading/v2.md +++ b/docs/upgrading/v2.md @@ -43,15 +43,15 @@ There is a new (simpler) syntax to use Bref's PHP runtimes in `serverless.yml`: functions: hello: # ... - runtime: php-81 + runtime: php-84 # instead of: runtime: provided.al2 layers: - - ${bref:layer.php-81} + - ${bref:layer.php-84} ``` -The [bref.sh](https://bref.sh) documentation now uses the simpler `runtime: php-81` syntax, but `${bref:layer.php-xxx}` variables still work! These variables are not deprecated. There are no breaking changes here. +The [bref.sh](https://bref.sh) documentation now uses the simpler `runtime: php-84` syntax, but `${bref:layer.php-xxx}` variables still work! These variables are not deprecated. There are no breaking changes here. ## Bref CLI diff --git a/docs/upgrading/v3.md b/docs/upgrading/v3.md index 5633101e8..e04067a55 100644 --- a/docs/upgrading/v3.md +++ b/docs/upgrading/v3.md @@ -4,6 +4,10 @@ introduction: Upgrading guide to go from Bref 2.x to Bref 3.0. # Upgrading to Bref 3.0 +### PHP 8.2 required + +Bref 3.0 now requires PHP 8.2 or greater. + ## Smaller breaking changes that might impact you The changes below should not impact the majority of users. However, if you are using any of these features, you might need to update your code. diff --git a/docs/use-cases/cron.mdx b/docs/use-cases/cron.mdx index 4eda71636..44750bebd 100644 --- a/docs/use-cases/cron.mdx +++ b/docs/use-cases/cron.mdx @@ -22,7 +22,7 @@ functions: Cron events can be used to run CLI commands with the [Console runtime](../runtimes/console.md). -In that case, use the `php-xx-console` runtime (for example `php-81-console`). +In that case, use the `php-xx-console` runtime (for example `php-84-console`). This is usually best when coupled with a framework like Laravel or Symfony, or when porting an existing cron task to AWS Lambda. @@ -33,7 +33,7 @@ This is usually best when coupled with a framework like Laravel or Symfony, or w # ... cron: handler: artisan - runtime: php-81-console + runtime: php-84-console events: - schedule: rate: rate(1 hour) @@ -51,7 +51,7 @@ This is usually best when coupled with a framework like Laravel or Symfony, or w # ... artisan: handler: artisan - runtime: php-81-console + runtime: php-84-console events: - schedule: rate: rate(1 minute) @@ -64,7 +64,7 @@ This is usually best when coupled with a framework like Laravel or Symfony, or w # ... cron: handler: bin/console - runtime: php-81-console + runtime: php-84-console events: - schedule: rate: rate(1 hour) @@ -81,7 +81,7 @@ This is usually best when coupled with a framework like Laravel or Symfony, or w # ... cron: handler: my-script.php - runtime: php-81-console + runtime: php-84-console events: - schedule: rate: rate(1 hour) @@ -96,7 +96,7 @@ This is usually best when coupled with a framework like Laravel or Symfony, or w # ... cron: handler: my-script.php - runtime: php-81-console + runtime: php-84-console events: - schedule: rate: rate(1 hour) @@ -122,7 +122,7 @@ On top of running CLI cron tasks with the `php-xx-console` runtime, we can also # ... cron: handler: App\MyCronHandler - runtime: php-81 + runtime: php-84 events: - schedule: rate: rate(1 hour) @@ -165,7 +165,7 @@ On top of running CLI cron tasks with the `php-xx-console` runtime, we can also # ... cron: handler: App\MyCronHandler - runtime: php-81 + runtime: php-84 events: - schedule: rate: rate(1 hour) @@ -208,7 +208,7 @@ On top of running CLI cron tasks with the `php-xx-console` runtime, we can also # ... cron: handler: function.php - runtime: php-81-console + runtime: php-84-console events: - schedule: rate: rate(1 hour) diff --git a/docs/use-cases/http.mdx b/docs/use-cases/http.mdx index 152285db3..27edf4d92 100644 --- a/docs/use-cases/http.mdx +++ b/docs/use-cases/http.mdx @@ -37,14 +37,14 @@ Bref sets up API Gateway with AWS Lambda and the [PHP-FPM runtime](../runtimes/f functions: web: handler: public/index.php - runtime: php-81-fpm + runtime: php-84-fpm events: - httpApi: '*' ``` This configuration deploys an API Gateway that forwards all routes (`*` is a wildcard) to AWS Lambda. -On Lambda, the `php-81-fpm` runtime starts PHP-FPM and forwards all requests to it. PHP-FPM then runs the PHP code. +On Lambda, the `php-84-fpm` runtime starts PHP-FPM and forwards all requests to it. PHP-FPM then runs the PHP code. This is perfect for most use-cases: **PHP works like on any server** with PHP-FPM. HTTP routing based on the URL is done by the application/the framework. diff --git a/docs/use-cases/http/advanced-use-cases.mdx b/docs/use-cases/http/advanced-use-cases.mdx index cc7333931..f567620fe 100644 --- a/docs/use-cases/http/advanced-use-cases.mdx +++ b/docs/use-cases/http/advanced-use-cases.mdx @@ -189,7 +189,7 @@ Then, create a Lambda function that listens to HTTP events with the handler you functions: # ... handler: App\MyHttpHandler - runtime: php-81 + runtime: php-84 # Lambda Function URL url: true # Or API Gateway @@ -207,7 +207,7 @@ Then, create a Lambda function that listens to HTTP events with the handler you functions: # ... handler: App\MyHttpHandler - runtime: php-81 + runtime: php-84 # Lambda Function URL url: true # Or API Gateway @@ -225,7 +225,7 @@ Then, create a Lambda function that listens to HTTP events with the handler you functions: # ... handler: handler.php - runtime: php-81 + runtime: php-84 # Lambda Function URL url: true # Or API Gateway @@ -254,12 +254,12 @@ Since a handler is a controller for a specific route, we can use the API Gateway functions: create-article: handler: App\CreateArticleController - runtime: php-81 + runtime: php-84 events: - httpApi: 'POST /articles' get-article: handler: App\GetArticleController - runtime: php-81 + runtime: php-84 events: - httpApi: 'GET /articles/{id}' ``` diff --git a/index.js b/index.js index ae319f57f..1518f3e6f 100644 --- a/index.js +++ b/index.js @@ -47,7 +47,7 @@ class ServerlessPlugin { .filter(name => !name.startsWith('arm-')); // Console runtimes must have a PHP version provided this.runtimes = this.runtimes.filter(name => name !== 'console'); - this.runtimes.push('php-80-console', 'php-81-console', 'php-82-console', 'php-83-console', 'php-84-console'); + this.runtimes.push('php-82-console', 'php-83-console', 'php-84-console'); this.checkCompatibleRuntime(); diff --git a/tests/FpmRuntime/FpmHandlerTest.php b/tests/FpmRuntime/FpmHandlerTest.php index 9ae4e7ce0..b332a4bc0 100644 --- a/tests/FpmRuntime/FpmHandlerTest.php +++ b/tests/FpmRuntime/FpmHandlerTest.php @@ -883,12 +883,6 @@ public function test POST request with multipart file uploads(int $version 'HTTP_RAW_BODY' => '', ]; - if (\PHP_VERSION_ID < 80100) { - // full_path was introduced in PHP 8.1, remove it for lower versions - unset($expectedGlobalVariables['$_FILES']['foo']['full_path']); - unset($expectedGlobalVariables['$_FILES']['bar']['full_path']); - } - $this->assertGlobalVariables($event, $expectedGlobalVariables); } diff --git a/utils/layers.json/update.php b/utils/layers.json/update.php index 74228ca93..c7a71bbee 100644 --- a/utils/layers.json/update.php +++ b/utils/layers.json/update.php @@ -19,20 +19,12 @@ 'php-83-fpm', 'php-82', 'php-82-fpm', - 'php-81', - 'php-81-fpm', - 'php-80', - 'php-80-fpm', 'arm-php-84', 'arm-php-84-fpm', 'arm-php-83', 'arm-php-83-fpm', 'arm-php-82', 'arm-php-82-fpm', - 'arm-php-81', - 'arm-php-81-fpm', - 'arm-php-80', - 'arm-php-80-fpm', 'console', ]; diff --git a/website/src/pages/news/02-bref-2.0.mdx b/website/src/pages/news/02-bref-2.0.mdx index 1f2d919f1..f624319ff 100644 --- a/website/src/pages/news/02-bref-2.0.mdx +++ b/website/src/pages/news/02-bref-2.0.mdx @@ -70,7 +70,7 @@ functions: handler: public/index.php # ... layers: - - ${bref:layer.php-81-fpm} + - ${bref:layer.php-84-fpm} ``` After (Bref v2 syntax): @@ -82,10 +82,10 @@ functions: api: handler: public/index.php # ... - runtime: php-81-fpm + runtime: php-84-fpm ``` -As you can see, we no longer have to set `runtime: provided.al2` and add the Bref layers. We can now directly set a PHP runtime (`php-81`, `php-81-fpm`, `php-81-console`) and Bref will transform this into the proper runtime + layers configuration. +As you can see, we no longer have to set `runtime: provided.al2` and add the Bref layers. We can now directly set a PHP runtime (`php-84`, `php-84-fpm`, `php-84-console`) and Bref will transform this into the proper runtime + layers configuration. This works for all the Bref runtimes ([FPM](https://bref.sh/docs/runtimes/http.html), [function](https://bref.sh/docs/runtimes/function.html) and [console](https://bref.sh/docs/runtimes/console.html)) and all supported PHP versions (`80`, `81`, and `82` at the moment). Here's a recap: @@ -93,24 +93,24 @@ This works for all the Bref runtimes ([FPM](https://bref.sh/docs/runtimes/http.h # PHP-FPM runtime (web apps) runtime: provided.al2 layers: - - ${bref:layer.php-81-fpm} + - ${bref:layer.php-84-fpm} # becomes: -runtime: php-81-fpm +runtime: php-84-fpm # Function runtime runtime: provided.al2 layers: - - ${bref:layer.php-81} + - ${bref:layer.php-84} # becomes: -runtime: php-81 +runtime: php-84 # Console runtime runtime: provided.al2 layers: - - ${bref:layer.php-81} + - ${bref:layer.php-84} - ${bref:layer.console} # becomes: -runtime: php-81-console +runtime: php-84-console ``` The Bref documentation has been updated to reflect these changes. @@ -174,7 +174,7 @@ functions: # ... layers: # Add the `-arm` prefix in layers 👇 - - ${bref:layer.arm-php-81-fpm} + - ${bref:layer.arm-php-84-fpm} ``` ## Faster deployments From e9b513c54919c8397e649948ac0bc18f46c8f271 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sun, 25 May 2025 11:01:59 +0200 Subject: [PATCH 06/53] Improve v3 upgrade documentation --- docs/upgrading/v3.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/docs/upgrading/v3.md b/docs/upgrading/v3.md index e04067a55..4c7a2dd14 100644 --- a/docs/upgrading/v3.md +++ b/docs/upgrading/v3.md @@ -4,10 +4,25 @@ introduction: Upgrading guide to go from Bref 2.x to Bref 3.0. # Upgrading to Bref 3.0 +## Updating dependencies + ### PHP 8.2 required Bref 3.0 now requires PHP 8.2 or greater. +### Composer Dependencies + +You should update the `bref/bref` dependency in your application's composer.json file: + +```diff +- "bref/bref": "^2", ++ "bref/bref": "^3", +``` + +Then run `composer update bref/bref --with-all-dependencies`. + +If you use the [Bref Extra extensions](https://github.com/brefphp/extra-php-extensions), you also need to update the `bref/extra-php-extensions` package to version `^3.0`. + ## Smaller breaking changes that might impact you The changes below should not impact the majority of users. However, if you are using any of these features, you might need to update your code. From ec475d5e2c99102f9111bc5ecc48190b1e1927f5 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sun, 25 May 2025 11:51:45 +0200 Subject: [PATCH 07/53] Upgrade documentation --- docs/upgrading/{v3.md => v3.mdx} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename docs/upgrading/{v3.md => v3.mdx} (100%) diff --git a/docs/upgrading/v3.md b/docs/upgrading/v3.mdx similarity index 100% rename from docs/upgrading/v3.md rename to docs/upgrading/v3.mdx From 17e130c227f3866db7a3ab85ef21ed2e2206f641 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sun, 25 May 2025 16:46:07 +0200 Subject: [PATCH 08/53] Switch to a single layer (#1950) * Switch to a single layer * Force display_errors * Fix tests * Fix CS * Upgrade documentation * Upgrade documentation * Upgrade documentation for containers --- docs/deploy/docker.mdx | 27 +-- docs/local-development.mdx | 4 +- .../event-driven-functions.mdx | 6 +- docs/upgrading/v3.mdx | 184 +++++++++++++++++- index.js | 95 +++++---- src/FpmRuntime/FpmHandler.php | 13 +- src/FpmRuntime/Main.php | 4 - tests/PluginTest.php | 44 +++-- utils/layers.json/update.php | 7 - 9 files changed, 292 insertions(+), 92 deletions(-) diff --git a/docs/deploy/docker.mdx b/docs/deploy/docker.mdx index 8d2035a30..fab9a5328 100644 --- a/docs/deploy/docker.mdx +++ b/docs/deploy/docker.mdx @@ -29,11 +29,14 @@ You should consider deploying using Docker when: Bref helps you deploy using Docker images by offering base images that work on AWS Lambda. Here is an example of a Dockerfile you can use: ```dockerfile filename="Dockerfile" -FROM bref/php-84-fpm:2 +FROM bref/php-84:3 # Copy the source code in the image COPY . /var/task +# In this example we're serving an HTTP application with php-fpm +ENV BREF_RUNTIME=fpm + # Configure the handler file (the entrypoint that receives all HTTP requests) CMD ["public/index.php"] ``` @@ -43,14 +46,14 @@ The `CMD` instruction let us specify the entrypoint that will handle all request Always specify the major version of the Bref image you want to use. That avoids breaking changes when a new major version is released. - For example `bref/php-84-fpm:3` points to Bref v3. + For example `bref/php-84:3` points to Bref v3. -Bref offers the following base images: +The `ENV BREF_RUNTIME=fpm` let's us specify which [runtime](../runtimes.mdx) to use. As a reminder, Bref offers the following runtimes: -- `bref/php-xx-fpm:3`: PHP-FPM to run HTTP applications -- `bref/php-xx-console:3`: to run PHP CLI commands -- `bref/php-xx:3`: to run [PHP functions](../runtimes/function.mdx) +- `fpm`: [uses PHP-FPM to serve web applications](../runtimes/fpm-runtime.mdx) +- `function`: [to run PHP code](../runtimes/function.mdx) +- `console`: [to run CLI commands](../runtimes/console.mdx) The `CMD` instruction in `Dockerfile` must contain a valid JSON array. This is why you must escape any `\` character. This is important for PHP class names, for example when using Laravel Octane: @@ -65,10 +68,10 @@ Bref offers the following base images: You can enable additional PHP extensions by pulling them from [Bref Extra Extensions](https://github.com/brefphp/extra-php-extensions): ```dockerfile filename="Dockerfile" {3-4} -FROM bref/php-84-fpm:2 +FROM bref/php-84:3 -COPY --from=bref/extra-redis-php-84:1 /opt /opt -COPY --from=bref/extra-gmp-php-84:1 /opt /opt +COPY --from=bref/extra-redis-php-84:3 /opt /opt +COPY --from=bref/extra-gmp-php-84:3 /opt /opt COPY . /var/task @@ -76,9 +79,9 @@ CMD ["public/index.php"] ``` - Like the Bref images, always specify the major version of the Bref Extra Extensions images: `bref/extra-*:1` points to Bref Extra Extensions v1. + Like the Bref images, always specify the major version of the Bref Extra Extensions images: `bref/extra-*:3` points to Bref Extra Extensions v3. - Note that Bref v2 is compatible with Bref Extra Extensions v1 (yes that's confusing, sorry about that, we will fix that in Bref v3 to have matching versions). + Note that Bref v3 is compatible with Bref Extra Extensions v3. ## Deployment @@ -126,6 +129,6 @@ The `/tmp` folder will always be empty on cold starts. Avoid writing content to ## Docker Registry -AWS Lambda only support AWS ECR as the source location for Docker images. +AWS Lambda only supports AWS ECR as the source location for Docker images. AWS Lambda will use the image digest as the unique identifier. This means that even if you overwrite the exact same tag on ECR, your lambda will still run the previous image code until you actually redeploy using the new image. diff --git a/docs/local-development.mdx b/docs/local-development.mdx index b5af0d95c..aee7bc96a 100644 --- a/docs/local-development.mdx +++ b/docs/local-development.mdx @@ -42,7 +42,7 @@ version: "3.5" services: app: - image: bref/php-84-fpm-dev:3 + image: bref/php-84-dev:3 ports: [ '8000:8000' ] volumes: - .:/var/task @@ -62,7 +62,7 @@ The application will be available at [http://localhost:8000/](http://localhost:8 The `HANDLER` environment variable lets you define which PHP file will be handling all HTTP requests. This should be the same handler that you have defined in `serverless.yml` for your HTTP function. -> Currently, the Docker image support only one PHP handler. If you have multiple HTTP functions in `serverless.yml`, you can duplicate the service in `docker-compose.yml` to have one container per lambda function. +> Currently, the Docker image supports only one PHP handler. If you have multiple HTTP functions in `serverless.yml`, you can duplicate the service in `docker-compose.yml` to have one container per lambda function. ### Read-only filesystem diff --git a/docs/local-development/event-driven-functions.mdx b/docs/local-development/event-driven-functions.mdx index f7debd20a..58e4249b1 100644 --- a/docs/local-development/event-driven-functions.mdx +++ b/docs/local-development/event-driven-functions.mdx @@ -88,8 +88,8 @@ If you want to run your function in Docker: ```bash $ docker run --rm -it --entrypoint= -v $(PWD):/var/task:ro bref/php-84:3 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-84-fpm-dev:3 vendor/bin/bref-local my-function.php +# You can also use the `dev` images for a simpler command (and Xdebug in the image): +$ docker run --rm -it -v $(PWD):/var/task:ro bref/php-84-dev:3 vendor/bin/bref-local my-function.php ``` You can also use Docker Compose, like described in [Local development for HTTP applications](../local-development.mdx): @@ -98,7 +98,7 @@ You can also use Docker Compose, like described in [Local development for HTTP a version: "3.5" services: app: - image: bref/php-84-fpm-dev:3 + image: bref/php-84-dev:3 volumes: - .:/var/task ``` diff --git a/docs/upgrading/v3.mdx b/docs/upgrading/v3.mdx index 4c7a2dd14..cbbf83344 100644 --- a/docs/upgrading/v3.mdx +++ b/docs/upgrading/v3.mdx @@ -23,20 +23,194 @@ Then run `composer update bref/bref --with-all-dependencies`. If you use the [Bref Extra extensions](https://github.com/brefphp/extra-php-extensions), you also need to update the `bref/extra-php-extensions` package to version `^3.0`. +## Container image changes + +If you deploy using [container images](../deploy/docker.mdx), you must update your `Dockerfile`. + +First, change the major version of the Bref base image: + +```diff filename="Dockerfile" +- FROM bref/php-84-fpm:2 ++ FROM bref/php-84-fpm:3 + +# ... +``` + +Since Bref container images have been merged into a single `bref/php-xx` image, the following images don't exist anymore: `bref/php-xx-fpm` and `bref/php-xx-console`. + +You must replace the base image to `bref/php-xx` when needed and define the `BREF_RUNTIME` environment variable: + +```diff filename="Dockerfile" +FROM bref/php-84:3 + ++ ENV BREF_RUNTIME=function + +# ... +``` + +or + +```diff filename="Dockerfile" +- FROM bref/php-84-fpm:3 ++ FROM bref/php-84:3 + ++ ENV BREF_RUNTIME=fpm + +# ... +``` + +or + +```diff filename="Dockerfile" +- FROM bref/php-84-console:3 ++ FROM bref/php-84:3 + ++ ENV BREF_RUNTIME=console + +# ... +``` + +Separately, if you use the `bref/php-84-fpm-dev` image for local development, you need to update its name and version: + +```diff filename="Dockerfile" +- FROM bref/php-84-fpm-dev:2 ++ FROM bref/php-84-dev:3 + +# ... +``` + +The rest works as usual. + ## Smaller breaking changes that might impact you The changes below should not impact the majority of users. However, if you are using any of these features, you might need to update your code. ### Changed the AWS account ID for AWS Lambda layers -The AWS account ID where Bref layers are published is different for v3. That lets us keep releasing Bref v2 layers without mixing up layer numbers. - -For Bref v3 layers, you need to use `873528684822` as the AWS account number (instead of `534081306603`). +The AWS account ID where Bref layers are published is different for v3. That lets us keep releasing Bref v2 layers without mixing up layer numbers. If you reference the layers via their full ARN, you must update the Bref AWS account number to `873528684822` (instead of `534081306603`). ```bash # Bref v2 layer -arn:aws:lambda:eu-west-2:534081306603:layer:php-84:xxx +arn:aws:lambda:us-east-1:534081306603:layer:php-84:xxx # Bref v3 layer -arn:aws:lambda:eu-west-2:873528684822:layer:php-84:xxx +arn:aws:lambda:us-east-1:873528684822:layer:php-84:xxx ``` + +**If you don't know what that means**, you're likely not concerned by this change. + +If you're not sure, search for `534081306603` in your codebase and replace it with the new account ID. + +### AWS Lambda layers have been merged into a single layer + +If you configure the `runtime` in your functions using the following syntax: + +```yml filename="serverless.yml" +functions: + web: + # ... + runtime: php-84-fpm # or `php-xx` or `php-xx-console` +``` + +✅ **you have nothing to do**, your configuration is valid for Bref v3. + +However, if you specify AWS Lambda layers explicitly in `serverless.yml` (or through any other deployment method), for example: + +```yml filename="serverless.yml" +functions: + web: + # ... + runtime: provided.al2 + layers: + - ${bref:layer.php-84} + # or: + - ${bref:layer.php-84-fpm} + # or: + layers: + - 'arn:aws:lambda:us-east-1:534081306603:layer:php-84:21' +``` + +Then you must update your configuration. + +Under the hood, **all layers have been merged into one**, i.e. `php-xx-fpm` and `php-xx-console` have been merged into `php-xx` to make Bref layers simpler. The runtime is now defined via an environment variable that is automatically injected by Bref when using the `runtime:` syntax. + +- **Option 1**: switch to using the simpler `runtime:` syntax. + + Before: + + ```yml filename="serverless.yml" + functions: + web: + # ... + runtime: provided.al2 + layers: + - ${bref:layer.php-84} + # or: + - ${bref:layer.php-84-fpm} + # or: + - ${bref:layer.php-84-console} + ``` + + After: + + ```yml filename="serverless.yml" + functions: + web: + # ... + runtime: php-84 + # or: + runtime: php-84-fpm + # or: + runtime: php-84-console + ``` + + The examples above assume you are using PHP 8.4 (`php-84`) but you can replace `84` with another PHP version. + + If you include additional layers, you can keep them without issues, for example: + + ```yml filename="serverless.yml" + functions: + web: + # ... + runtime: php-84-fpm + layers: + - ${bref-extra:imagick-php-84} + ``` + +- **Option 2**: change the layer names and define the `BREF_RUNTIME` environment variable. + + Before: + + ```yml filename="serverless.yml" + functions: + web: + # ... + runtime: provided.al2 + layers: + - ${bref:layer.php-84} + # or: + - ${bref:layer.php-84-fpm} + # or: + - ${bref:layer.php-84-console} + ``` + + After: + + ```yml filename="serverless.yml" + functions: + web: + # ... + runtime: provided.al2 + layers: + - ${bref:layer.php-84} + environment: + # ... + BREF_RUNTIME: function # for ${bref:layer.php-xx} + # or + BREF_RUNTIME: fpm # for ${bref:layer.php-xx-fpm} + # or + BREF_RUNTIME: console # ${bref:layer.php-xx-console} + ``` + + The examples above assume you are using PHP 8.4 (`php-84`) but you can replace `84` with another PHP version. + diff --git a/index.js b/index.js index 1518f3e6f..a86b4a158 100644 --- a/index.js +++ b/index.js @@ -173,21 +173,67 @@ class ServerlessPlugin { * Process the `php-xx` runtimes to turn them into `provided.al2` runtimes + Bref layers. */ processPhpRuntimes() { - const includeBrefLayers = (runtime, existingLayers, isArm) => { - let layerName = runtime; + const includeBrefLayers = (existingLayers, phpVersion, isArm) => { + let layerName = 'php-' + phpVersion; // Automatically use ARM layers if the function is deployed to an ARM architecture if (isArm) { layerName = 'arm-' + layerName; } - if (layerName.endsWith('-console')) { - layerName = layerName.substring(0, layerName.length - '-console'.length); - existingLayers.unshift(this.getLayerArn('console', this.provider.getRegion())); - existingLayers.unshift(this.getLayerArn(layerName, this.provider.getRegion())); - } else { - existingLayers.unshift(this.getLayerArn(layerName, this.provider.getRegion())); - } + existingLayers.unshift(this.getLayerArn(layerName, this.provider.getRegion())); return existingLayers; } + /** + * @param {string} runtime + * @return {string|undefined} + */ + const runtimeStringToRuntimeClass = (runtime) => { + if (! runtime.startsWith('php-')) { + return undefined; + } + if (runtime.endsWith('-console')) { + return 'Bref\\ConsoleRuntime\\Main'; + } + if (runtime.endsWith('-fpm')) { + return 'Bref\\FpmRuntime\\Main'; + } + return 'Bref\\FunctionRuntime\\Main'; + }; + const configureFunctionRuntime = (f) => { + // `php-\d\d(-fpm|console)?` + const fullRuntimeString = f.runtime || config.provider.runtime; + if (! fullRuntimeString || ! fullRuntimeString.startsWith('php-')) { + return; + } + const phpVersion = fullRuntimeString.substring('php-'.length).split('-')[0]; + const runtimeClass = runtimeStringToRuntimeClass(fullRuntimeString); + if (! runtimeClass) return; + + // The logic here is a bit custom: + // If there are layers on the function, we preserve them + let existingLayers = f.layers || []; // make sure it's an array + // Else, we merge with the layers defined at the root. + // Indeed, SF overrides the layers defined at the root with the ones defined on the function. + if (existingLayers.length === 0) { + // for some reason it's not always an array + existingLayers = Array.from(config.provider.layers || []); + } + + f.layers = includeBrefLayers( + existingLayers, + phpVersion, + f.architecture === 'arm64' || (isArmGlobally && !f.architecture), + ); + f.runtime = 'provided.al2'; + // Add the `BREF_RUNTIME` environment variable + // to let the function know which runtime it is using + // (this is used by the Bref runtime) + if (!f.environment) { + f.environment = {}; + } + if (!f.environment.BREF_RUNTIME) { + f.environment.BREF_RUNTIME = runtimeClass; + } + } const config = this.serverless.service; const isArmGlobally = config.provider.architecture === 'arm64'; @@ -195,40 +241,15 @@ class ServerlessPlugin { // Check functions config for (const f of Object.values(config.functions || {})) { - if ( - (f.runtime && this.runtimes.includes(f.runtime)) || - (!f.runtime && isBrefRuntimeGlobally) - ) { - // The logic here is a bit custom: - // If there are layers on the function, we preserve them - let existingLayers = f.layers || []; // make sure it's an array - // Else, we merge with the layers defined at the root. - // Indeed, SF overrides the layers defined at the root with the ones defined on the function. - if (existingLayers.length === 0) { - // for some reason it's not always an array - existingLayers = Array.from(config.provider.layers || []); - } - - f.layers = includeBrefLayers( - f.runtime || config.provider.runtime, - existingLayers, - f.architecture === 'arm64' || (isArmGlobally && !f.architecture), - ); - f.runtime = 'provided.al2'; - } + configureFunctionRuntime(f); } // Check Lift constructs config for (const construct of Object.values(this.serverless.configurationInput.constructs || {})) { if (construct.type !== 'queue' && construct.type !== 'webhook') continue; const f = construct.type === 'queue' ? construct.worker : construct.authorizer; - if (f && (f.runtime && this.runtimes.includes(f.runtime) || !f.runtime && isBrefRuntimeGlobally) ) { - f.layers = includeBrefLayers( - f.runtime || config.provider.runtime, - f.layers || [], // make sure it's an array - f.architecture === 'arm64' || (isArmGlobally && !f.architecture), - ); - f.runtime = 'provided.al2'; + if (f) { + configureFunctionRuntime(f); } } } diff --git a/src/FpmRuntime/FpmHandler.php b/src/FpmRuntime/FpmHandler.php index caa1ef145..597f006b9 100644 --- a/src/FpmRuntime/FpmHandler.php +++ b/src/FpmRuntime/FpmHandler.php @@ -76,8 +76,19 @@ public function start(): void /** * --nodaemonize: we want to keep control of the process * --force-stderr: force logs to be sent to stderr, which will allow us to send them to CloudWatch + * TODO set `max_execution_time` to the timeout of the Lambda function? */ - $resource = @proc_open(['php-fpm', '--nodaemonize', '--force-stderr', '--fpm-config', $this->configFile], [], $pipes); + $resource = @proc_open([ + 'php-fpm', + '--nodaemonize', + '--force-stderr', + '--fpm-config', + $this->configFile, + // Override ini settings to force disabling display_errors + // Displaying errors in the HTTP response is a security risk + '-d', + 'display_errors=0', + ], [], $pipes); if (! is_resource($resource)) { throw new RuntimeException('PHP-FPM failed to start'); diff --git a/src/FpmRuntime/Main.php b/src/FpmRuntime/Main.php index 2eb7c6a0c..adf570311 100755 --- a/src/FpmRuntime/Main.php +++ b/src/FpmRuntime/Main.php @@ -16,10 +16,6 @@ class Main { public static function run(): void { - // In the FPM runtime process (our process) we want to log all errors and warnings - ini_set('display_errors', '1'); - error_reporting(E_ALL); - ColdStartTracker::init(); LazySecretsLoader::loadSecretEnvironmentVariables(); diff --git a/tests/PluginTest.php b/tests/PluginTest.php index 4da695d1c..debcae0a5 100644 --- a/tests/PluginTest.php +++ b/tests/PluginTest.php @@ -2,6 +2,9 @@ namespace Bref\Test; +use Bref\ConsoleRuntime\Main as ConsoleMain; +use Bref\FpmRuntime\Main as FpmMain; +use Bref\FunctionRuntime\Main as FunctionMain; use PHPUnit\Framework\TestCase; use Symfony\Component\Process\Process; use Symfony\Component\Yaml\Yaml; @@ -12,26 +15,24 @@ public function test the plugin adds the layers(): void { $output = $this->slsPrint('serverless.yml'); - self::assertFunction($output['functions']['function'], [ + self::assertFunction($output['functions']['function'], FunctionMain::class, [ 'arn:aws:lambda:us-east-1:873528684822:layer:php-83:', ]); - self::assertFunction($output['functions']['fpm'], [ - 'arn:aws:lambda:us-east-1:873528684822:layer:php-83-fpm:', + self::assertFunction($output['functions']['fpm'], FpmMain::class, [ + 'arn:aws:lambda:us-east-1:873528684822:layer:php-83:', ]); - self::assertFunction($output['functions']['console'], [ + self::assertFunction($output['functions']['console'], ConsoleMain::class, [ 'arn:aws:lambda:us-east-1:873528684822:layer:php-83:', - 'arn:aws:lambda:us-east-1:873528684822:layer:console:', ]); - self::assertFunction($output['functions']['function-arm'], [ + self::assertFunction($output['functions']['function-arm'], FunctionMain::class, [ 'arn:aws:lambda:us-east-1:873528684822:layer:arm-php-83:', ]); - self::assertFunction($output['functions']['fpm-arm'], [ - 'arn:aws:lambda:us-east-1:873528684822:layer:arm-php-83-fpm:', + self::assertFunction($output['functions']['fpm-arm'], FpmMain::class, [ + 'arn:aws:lambda:us-east-1:873528684822:layer:arm-php-83:', ]); - self::assertFunction($output['functions']['console-arm'], [ + self::assertFunction($output['functions']['console-arm'], ConsoleMain::class, [ 'arn:aws:lambda:us-east-1:873528684822:layer:arm-php-83:', - 'arn:aws:lambda:us-east-1:873528684822:layer:console:', ]); } @@ -39,10 +40,10 @@ public function test the plugin adds the layers when the runtime is se { $output = $this->slsPrint('serverless-runtime-root.yml'); - self::assertFunction($output['functions']['function'], [ + self::assertFunction($output['functions']['function'], FunctionMain::class, [ 'arn:aws:lambda:us-east-1:873528684822:layer:php-83:', ]); - self::assertFunction($output['functions']['function-arm'], [ + self::assertFunction($output['functions']['function-arm'], FunctionMain::class, [ 'arn:aws:lambda:us-east-1:873528684822:layer:arm-php-83:', ]); } @@ -51,21 +52,21 @@ public function test the plugin doesnt break layers added separately(): v { $output = $this->slsPrint('serverless-with-layers.yml'); - self::assertFunction($output['functions']['function'], [ + self::assertFunction($output['functions']['function'], FunctionMain::class, [ 'arn:aws:lambda:us-east-1:873528684822:layer:php-83:', 'arn:aws:lambda:us-east-1:1234567890:layer:foo:1', ]); - self::assertFunction($output['functions']['function-arm'], [ + self::assertFunction($output['functions']['function-arm'], FunctionMain::class, [ 'arn:aws:lambda:us-east-1:873528684822:layer:arm-php-83:', 'arn:aws:lambda:us-east-1:1234567890:layer:foo:1', ]); - self::assertFunction($output['functions']['function-with-layers'], [ + self::assertFunction($output['functions']['function-with-layers'], FunctionMain::class, [ 'arn:aws:lambda:us-east-1:873528684822:layer:php-83:', // This function doesn't have the `foo` layer because that's how SF works: // layers in the function completely override the layers in the root 'arn:aws:lambda:us-east-1:1234567890:layer:bar:1', ]); - self::assertFunction($output['functions']['function-arm-with-layers'], [ + self::assertFunction($output['functions']['function-arm-with-layers'], FunctionMain::class, [ 'arn:aws:lambda:us-east-1:873528684822:layer:arm-php-83:', // This function doesn't have the `foo` layer because that's how SF works: // layers in the function completely override the layers in the root @@ -77,21 +78,21 @@ public function test the plugin doesnt break layers added separately wit { $output = $this->slsPrint('serverless-runtime-root-with-layers.yml'); - self::assertFunction($output['functions']['function'], [ + self::assertFunction($output['functions']['function'], FunctionMain::class, [ 'arn:aws:lambda:us-east-1:873528684822:layer:php-83:', 'arn:aws:lambda:us-east-1:1234567890:layer:foo:1', ]); - self::assertFunction($output['functions']['function-arm'], [ + self::assertFunction($output['functions']['function-arm'], FunctionMain::class, [ 'arn:aws:lambda:us-east-1:873528684822:layer:arm-php-83:', 'arn:aws:lambda:us-east-1:1234567890:layer:foo:1', ]); - self::assertFunction($output['functions']['function-with-layers'], [ + self::assertFunction($output['functions']['function-with-layers'], FunctionMain::class, [ 'arn:aws:lambda:us-east-1:873528684822:layer:php-83:', // This function doesn't have the `foo` layer because that's how SF works: // layers in the function completely override the layers in the root 'arn:aws:lambda:us-east-1:1234567890:layer:bar:1', ]); - self::assertFunction($output['functions']['function-arm-with-layers'], [ + self::assertFunction($output['functions']['function-arm-with-layers'], FunctionMain::class, [ 'arn:aws:lambda:us-east-1:873528684822:layer:arm-php-83:', // This function doesn't have the `foo` layer because that's how SF works: // layers in the function completely override the layers in the root @@ -111,9 +112,10 @@ private function slsPrint(string $configFile): array return Yaml::parse($process->getOutput()); } - private static function assertFunction(array $config, array $layers): void + private static function assertFunction(array $config, string $brefRuntime, array $layers): void { self::assertEquals('provided.al2', $config['runtime']); + self::assertEquals($brefRuntime, $config['environment']['BREF_RUNTIME']); self::assertCount(count($layers), $config['layers'], sprintf('Expected %d layers, got %d: %s', count($layers), count($config['layers']), json_encode($config['layers'], JSON_THROW_ON_ERROR))); foreach ($layers as $index => $layer) { self::assertStringStartsWith($layer, $config['layers'][$index]); diff --git a/utils/layers.json/update.php b/utils/layers.json/update.php index c7a71bbee..1f261efbd 100644 --- a/utils/layers.json/update.php +++ b/utils/layers.json/update.php @@ -14,18 +14,11 @@ const LAYER_NAMES = [ 'php-84', - 'php-84-fpm', 'php-83', - 'php-83-fpm', 'php-82', - 'php-82-fpm', 'arm-php-84', - 'arm-php-84-fpm', 'arm-php-83', - 'arm-php-83-fpm', 'arm-php-82', - 'arm-php-82-fpm', - 'console', ]; $regions = json_decode(file_get_contents(__DIR__ . '/regions.json'), true); From b19fe71d89ec0f016f94d8577faeaf78f0cb2529 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 25 May 2025 16:51:10 +0200 Subject: [PATCH 09/53] Update layer versions (#1955) Co-authored-by: mnapoli <720328+mnapoli@users.noreply.github.com> --- layers.json | 384 +++------------------------------------------------- 1 file changed, 18 insertions(+), 366 deletions(-) diff --git a/layers.json b/layers.json index dece215f7..e93c31f90 100644 --- a/layers.json +++ b/layers.json @@ -18,34 +18,12 @@ "ap-northeast-3": "1", "ap-southeast-1": "1", "ap-southeast-2": "1", + "ap-southeast-3": "1", "eu-south-1": "1", "eu-south-2": "1", "af-south-1": "1", - "me-south-1": "1" - }, - "php-84-fpm": { - "ca-central-1": "", - "eu-central-1": "", - "eu-north-1": "", - "eu-west-1": "", - "eu-west-2": "", - "eu-west-3": "", - "sa-east-1": "", - "us-east-1": "", - "us-east-2": "", - "us-west-1": "", - "us-west-2": "", - "ap-east-1": "", - "ap-south-1": "", - "ap-northeast-1": "", - "ap-northeast-2": "", - "ap-northeast-3": "", - "ap-southeast-1": "", - "ap-southeast-2": "", - "eu-south-1": "", - "eu-south-2": "", - "af-south-1": "", - "me-south-1": "" + "me-south-1": "1", + "me-central-1": "1" }, "php-83": { "ca-central-1": "1", @@ -66,34 +44,12 @@ "ap-northeast-3": "1", "ap-southeast-1": "1", "ap-southeast-2": "1", + "ap-southeast-3": "1", "eu-south-1": "1", "eu-south-2": "1", "af-south-1": "1", - "me-south-1": "1" - }, - "php-83-fpm": { - "ca-central-1": "", - "eu-central-1": "", - "eu-north-1": "", - "eu-west-1": "", - "eu-west-2": "", - "eu-west-3": "", - "sa-east-1": "", - "us-east-1": "", - "us-east-2": "", - "us-west-1": "", - "us-west-2": "", - "ap-east-1": "", - "ap-south-1": "", - "ap-northeast-1": "", - "ap-northeast-2": "", - "ap-northeast-3": "", - "ap-southeast-1": "", - "ap-southeast-2": "", - "eu-south-1": "", - "eu-south-2": "", - "af-south-1": "", - "me-south-1": "" + "me-south-1": "1", + "me-central-1": "1" }, "php-82": { "ca-central-1": "1", @@ -114,130 +70,12 @@ "ap-northeast-3": "1", "ap-southeast-1": "1", "ap-southeast-2": "1", + "ap-southeast-3": "1", "eu-south-1": "1", "eu-south-2": "1", "af-south-1": "1", - "me-south-1": "1" - }, - "php-82-fpm": { - "ca-central-1": "", - "eu-central-1": "", - "eu-north-1": "", - "eu-west-1": "", - "eu-west-2": "", - "eu-west-3": "", - "sa-east-1": "", - "us-east-1": "", - "us-east-2": "", - "us-west-1": "", - "us-west-2": "", - "ap-east-1": "", - "ap-south-1": "", - "ap-northeast-1": "", - "ap-northeast-2": "", - "ap-northeast-3": "", - "ap-southeast-1": "", - "ap-southeast-2": "", - "eu-south-1": "", - "eu-south-2": "", - "af-south-1": "", - "me-south-1": "" - }, - "php-81": { - "ca-central-1": "", - "eu-central-1": "", - "eu-north-1": "", - "eu-west-1": "", - "eu-west-2": "", - "eu-west-3": "", - "sa-east-1": "", - "us-east-1": "", - "us-east-2": "", - "us-west-1": "", - "us-west-2": "", - "ap-east-1": "", - "ap-south-1": "", - "ap-northeast-1": "", - "ap-northeast-2": "", - "ap-northeast-3": "", - "ap-southeast-1": "", - "ap-southeast-2": "", - "eu-south-1": "", - "eu-south-2": "", - "af-south-1": "", - "me-south-1": "" - }, - "php-81-fpm": { - "ca-central-1": "", - "eu-central-1": "", - "eu-north-1": "", - "eu-west-1": "", - "eu-west-2": "", - "eu-west-3": "", - "sa-east-1": "", - "us-east-1": "", - "us-east-2": "", - "us-west-1": "", - "us-west-2": "", - "ap-east-1": "", - "ap-south-1": "", - "ap-northeast-1": "", - "ap-northeast-2": "", - "ap-northeast-3": "", - "ap-southeast-1": "", - "ap-southeast-2": "", - "eu-south-1": "", - "eu-south-2": "", - "af-south-1": "", - "me-south-1": "" - }, - "php-80": { - "ca-central-1": "", - "eu-central-1": "", - "eu-north-1": "", - "eu-west-1": "", - "eu-west-2": "", - "eu-west-3": "", - "sa-east-1": "", - "us-east-1": "", - "us-east-2": "", - "us-west-1": "", - "us-west-2": "", - "ap-east-1": "", - "ap-south-1": "", - "ap-northeast-1": "", - "ap-northeast-2": "", - "ap-northeast-3": "", - "ap-southeast-1": "", - "ap-southeast-2": "", - "eu-south-1": "", - "eu-south-2": "", - "af-south-1": "", - "me-south-1": "" - }, - "php-80-fpm": { - "ca-central-1": "", - "eu-central-1": "", - "eu-north-1": "", - "eu-west-1": "", - "eu-west-2": "", - "eu-west-3": "", - "sa-east-1": "", - "us-east-1": "", - "us-east-2": "", - "us-west-1": "", - "us-west-2": "", - "ap-east-1": "", - "ap-south-1": "", - "ap-northeast-1": "", - "ap-northeast-2": "", - "ap-northeast-3": "", - "ap-southeast-1": "", - "ap-southeast-2": "", - "eu-south-1": "", - "eu-south-2": "", - "af-south-1": "", - "me-south-1": "" + "me-south-1": "1", + "me-central-1": "1" }, "arm-php-84": { "ca-central-1": "1", @@ -258,34 +96,12 @@ "ap-northeast-3": "1", "ap-southeast-1": "1", "ap-southeast-2": "1", + "ap-southeast-3": "1", "eu-south-1": "1", "eu-south-2": "1", "af-south-1": "1", - "me-south-1": "1" - }, - "arm-php-84-fpm": { - "ca-central-1": "", - "eu-central-1": "", - "eu-north-1": "", - "eu-west-1": "", - "eu-west-2": "", - "eu-west-3": "", - "sa-east-1": "", - "us-east-1": "", - "us-east-2": "", - "us-west-1": "", - "us-west-2": "", - "ap-east-1": "", - "ap-south-1": "", - "ap-northeast-1": "", - "ap-northeast-2": "", - "ap-northeast-3": "", - "ap-southeast-1": "", - "ap-southeast-2": "", - "eu-south-1": "", - "eu-south-2": "", - "af-south-1": "", - "me-south-1": "" + "me-south-1": "1", + "me-central-1": "1" }, "arm-php-83": { "ca-central-1": "1", @@ -306,34 +122,12 @@ "ap-northeast-3": "1", "ap-southeast-1": "1", "ap-southeast-2": "1", + "ap-southeast-3": "1", "eu-south-1": "1", "eu-south-2": "1", "af-south-1": "1", - "me-south-1": "1" - }, - "arm-php-83-fpm": { - "ca-central-1": "", - "eu-central-1": "", - "eu-north-1": "", - "eu-west-1": "", - "eu-west-2": "", - "eu-west-3": "", - "sa-east-1": "", - "us-east-1": "", - "us-east-2": "", - "us-west-1": "", - "us-west-2": "", - "ap-east-1": "", - "ap-south-1": "", - "ap-northeast-1": "", - "ap-northeast-2": "", - "ap-northeast-3": "", - "ap-southeast-1": "", - "ap-southeast-2": "", - "eu-south-1": "", - "eu-south-2": "", - "af-south-1": "", - "me-south-1": "" + "me-south-1": "1", + "me-central-1": "1" }, "arm-php-82": { "ca-central-1": "1", @@ -354,153 +148,11 @@ "ap-northeast-3": "1", "ap-southeast-1": "1", "ap-southeast-2": "1", + "ap-southeast-3": "1", "eu-south-1": "1", "eu-south-2": "1", "af-south-1": "1", - "me-south-1": "1" - }, - "arm-php-82-fpm": { - "ca-central-1": "", - "eu-central-1": "", - "eu-north-1": "", - "eu-west-1": "", - "eu-west-2": "", - "eu-west-3": "", - "sa-east-1": "", - "us-east-1": "", - "us-east-2": "", - "us-west-1": "", - "us-west-2": "", - "ap-east-1": "", - "ap-south-1": "", - "ap-northeast-1": "", - "ap-northeast-2": "", - "ap-northeast-3": "", - "ap-southeast-1": "", - "ap-southeast-2": "", - "eu-south-1": "", - "eu-south-2": "", - "af-south-1": "", - "me-south-1": "" - }, - "arm-php-81": { - "ca-central-1": "", - "eu-central-1": "", - "eu-north-1": "", - "eu-west-1": "", - "eu-west-2": "", - "eu-west-3": "", - "sa-east-1": "", - "us-east-1": "", - "us-east-2": "", - "us-west-1": "", - "us-west-2": "", - "ap-east-1": "", - "ap-south-1": "", - "ap-northeast-1": "", - "ap-northeast-2": "", - "ap-northeast-3": "", - "ap-southeast-1": "", - "ap-southeast-2": "", - "eu-south-1": "", - "eu-south-2": "", - "af-south-1": "", - "me-south-1": "" - }, - "arm-php-81-fpm": { - "ca-central-1": "", - "eu-central-1": "", - "eu-north-1": "", - "eu-west-1": "", - "eu-west-2": "", - "eu-west-3": "", - "sa-east-1": "", - "us-east-1": "", - "us-east-2": "", - "us-west-1": "", - "us-west-2": "", - "ap-east-1": "", - "ap-south-1": "", - "ap-northeast-1": "", - "ap-northeast-2": "", - "ap-northeast-3": "", - "ap-southeast-1": "", - "ap-southeast-2": "", - "eu-south-1": "", - "eu-south-2": "", - "af-south-1": "", - "me-south-1": "" - }, - "arm-php-80": { - "ca-central-1": "", - "eu-central-1": "", - "eu-north-1": "", - "eu-west-1": "", - "eu-west-2": "", - "eu-west-3": "", - "sa-east-1": "", - "us-east-1": "", - "us-east-2": "", - "us-west-1": "", - "us-west-2": "", - "ap-east-1": "", - "ap-south-1": "", - "ap-northeast-1": "", - "ap-northeast-2": "", - "ap-northeast-3": "", - "ap-southeast-1": "", - "ap-southeast-2": "", - "eu-south-1": "", - "eu-south-2": "", - "af-south-1": "", - "me-south-1": "" - }, - "arm-php-80-fpm": { - "ca-central-1": "", - "eu-central-1": "", - "eu-north-1": "", - "eu-west-1": "", - "eu-west-2": "", - "eu-west-3": "", - "sa-east-1": "", - "us-east-1": "", - "us-east-2": "", - "us-west-1": "", - "us-west-2": "", - "ap-east-1": "", - "ap-south-1": "", - "ap-northeast-1": "", - "ap-northeast-2": "", - "ap-northeast-3": "", - "ap-southeast-1": "", - "ap-southeast-2": "", - "eu-south-1": "", - "eu-south-2": "", - "af-south-1": "", - "me-south-1": "" - }, - "console": { - "ca-central-1": "", - "eu-central-1": "", - "eu-north-1": "", - "eu-west-1": "", - "eu-west-2": "", - "eu-west-3": "", - "sa-east-1": "", - "us-east-1": "", - "us-east-2": "", - "us-west-1": "", - "us-west-2": "", - "ap-east-1": "", - "ap-south-1": "", - "ap-northeast-1": "", - "ap-northeast-2": "", - "ap-northeast-3": "", - "ap-southeast-1": "", - "ap-southeast-2": "", - "eu-south-1": "", - "eu-south-2": "", - "af-south-1": "", - "me-south-1": "" + "me-south-1": "1", + "me-central-1": "1" } } \ No newline at end of file From 4ca7450d5d7e28909009b481084308b01dc9a0d1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 25 May 2025 18:54:20 +0200 Subject: [PATCH 10/53] Update layer versions (#1957) Co-authored-by: mnapoli <720328+mnapoli@users.noreply.github.com> --- layers.json | 288 ++++++++++++++++++++++++++-------------------------- 1 file changed, 144 insertions(+), 144 deletions(-) diff --git a/layers.json b/layers.json index e93c31f90..9796e048c 100644 --- a/layers.json +++ b/layers.json @@ -1,158 +1,158 @@ { "php-84": { - "ca-central-1": "1", - "eu-central-1": "1", - "eu-north-1": "1", - "eu-west-1": "1", - "eu-west-2": "1", - "eu-west-3": "1", - "sa-east-1": "1", - "us-east-1": "1", - "us-east-2": "1", - "us-west-1": "1", - "us-west-2": "1", - "ap-east-1": "1", - "ap-south-1": "1", - "ap-northeast-1": "1", - "ap-northeast-2": "1", - "ap-northeast-3": "1", - "ap-southeast-1": "1", - "ap-southeast-2": "1", - "ap-southeast-3": "1", - "eu-south-1": "1", - "eu-south-2": "1", - "af-south-1": "1", - "me-south-1": "1", - "me-central-1": "1" + "ca-central-1": "2", + "eu-central-1": "2", + "eu-north-1": "2", + "eu-west-1": "2", + "eu-west-2": "2", + "eu-west-3": "2", + "sa-east-1": "2", + "us-east-1": "2", + "us-east-2": "2", + "us-west-1": "2", + "us-west-2": "2", + "ap-east-1": "2", + "ap-south-1": "2", + "ap-northeast-1": "2", + "ap-northeast-2": "2", + "ap-northeast-3": "2", + "ap-southeast-1": "2", + "ap-southeast-2": "2", + "ap-southeast-3": "2", + "eu-south-1": "2", + "eu-south-2": "2", + "af-south-1": "2", + "me-south-1": "2", + "me-central-1": "2" }, "php-83": { - "ca-central-1": "1", - "eu-central-1": "1", - "eu-north-1": "1", - "eu-west-1": "1", - "eu-west-2": "1", - "eu-west-3": "1", - "sa-east-1": "1", - "us-east-1": "1", - "us-east-2": "1", - "us-west-1": "1", - "us-west-2": "1", - "ap-east-1": "1", - "ap-south-1": "1", - "ap-northeast-1": "1", - "ap-northeast-2": "1", - "ap-northeast-3": "1", - "ap-southeast-1": "1", - "ap-southeast-2": "1", - "ap-southeast-3": "1", - "eu-south-1": "1", - "eu-south-2": "1", - "af-south-1": "1", - "me-south-1": "1", - "me-central-1": "1" + "ca-central-1": "2", + "eu-central-1": "2", + "eu-north-1": "2", + "eu-west-1": "2", + "eu-west-2": "2", + "eu-west-3": "2", + "sa-east-1": "2", + "us-east-1": "2", + "us-east-2": "2", + "us-west-1": "2", + "us-west-2": "2", + "ap-east-1": "2", + "ap-south-1": "2", + "ap-northeast-1": "2", + "ap-northeast-2": "2", + "ap-northeast-3": "2", + "ap-southeast-1": "2", + "ap-southeast-2": "2", + "ap-southeast-3": "2", + "eu-south-1": "2", + "eu-south-2": "2", + "af-south-1": "2", + "me-south-1": "2", + "me-central-1": "2" }, "php-82": { - "ca-central-1": "1", - "eu-central-1": "1", - "eu-north-1": "1", - "eu-west-1": "1", - "eu-west-2": "1", - "eu-west-3": "1", - "sa-east-1": "1", - "us-east-1": "1", - "us-east-2": "1", - "us-west-1": "1", - "us-west-2": "1", - "ap-east-1": "1", - "ap-south-1": "1", - "ap-northeast-1": "1", - "ap-northeast-2": "1", - "ap-northeast-3": "1", - "ap-southeast-1": "1", - "ap-southeast-2": "1", - "ap-southeast-3": "1", - "eu-south-1": "1", - "eu-south-2": "1", - "af-south-1": "1", - "me-south-1": "1", - "me-central-1": "1" + "ca-central-1": "2", + "eu-central-1": "2", + "eu-north-1": "2", + "eu-west-1": "2", + "eu-west-2": "2", + "eu-west-3": "2", + "sa-east-1": "2", + "us-east-1": "2", + "us-east-2": "2", + "us-west-1": "2", + "us-west-2": "2", + "ap-east-1": "2", + "ap-south-1": "2", + "ap-northeast-1": "2", + "ap-northeast-2": "2", + "ap-northeast-3": "2", + "ap-southeast-1": "2", + "ap-southeast-2": "2", + "ap-southeast-3": "2", + "eu-south-1": "2", + "eu-south-2": "2", + "af-south-1": "2", + "me-south-1": "2", + "me-central-1": "2" }, "arm-php-84": { - "ca-central-1": "1", - "eu-central-1": "1", - "eu-north-1": "1", - "eu-west-1": "1", - "eu-west-2": "1", - "eu-west-3": "1", - "sa-east-1": "1", - "us-east-1": "1", - "us-east-2": "1", - "us-west-1": "1", - "us-west-2": "1", - "ap-east-1": "1", - "ap-south-1": "1", - "ap-northeast-1": "1", - "ap-northeast-2": "1", - "ap-northeast-3": "1", - "ap-southeast-1": "1", - "ap-southeast-2": "1", - "ap-southeast-3": "1", - "eu-south-1": "1", - "eu-south-2": "1", - "af-south-1": "1", - "me-south-1": "1", - "me-central-1": "1" + "ca-central-1": "2", + "eu-central-1": "2", + "eu-north-1": "2", + "eu-west-1": "2", + "eu-west-2": "2", + "eu-west-3": "2", + "sa-east-1": "2", + "us-east-1": "2", + "us-east-2": "2", + "us-west-1": "2", + "us-west-2": "2", + "ap-east-1": "2", + "ap-south-1": "2", + "ap-northeast-1": "2", + "ap-northeast-2": "2", + "ap-northeast-3": "2", + "ap-southeast-1": "2", + "ap-southeast-2": "2", + "ap-southeast-3": "2", + "eu-south-1": "2", + "eu-south-2": "2", + "af-south-1": "2", + "me-south-1": "2", + "me-central-1": "2" }, "arm-php-83": { - "ca-central-1": "1", - "eu-central-1": "1", - "eu-north-1": "1", - "eu-west-1": "1", - "eu-west-2": "1", - "eu-west-3": "1", - "sa-east-1": "1", - "us-east-1": "1", - "us-east-2": "1", - "us-west-1": "1", - "us-west-2": "1", - "ap-east-1": "1", - "ap-south-1": "1", - "ap-northeast-1": "1", - "ap-northeast-2": "1", - "ap-northeast-3": "1", - "ap-southeast-1": "1", - "ap-southeast-2": "1", - "ap-southeast-3": "1", - "eu-south-1": "1", - "eu-south-2": "1", - "af-south-1": "1", - "me-south-1": "1", - "me-central-1": "1" + "ca-central-1": "2", + "eu-central-1": "2", + "eu-north-1": "2", + "eu-west-1": "2", + "eu-west-2": "2", + "eu-west-3": "2", + "sa-east-1": "2", + "us-east-1": "2", + "us-east-2": "2", + "us-west-1": "2", + "us-west-2": "2", + "ap-east-1": "2", + "ap-south-1": "2", + "ap-northeast-1": "2", + "ap-northeast-2": "2", + "ap-northeast-3": "2", + "ap-southeast-1": "2", + "ap-southeast-2": "2", + "ap-southeast-3": "2", + "eu-south-1": "2", + "eu-south-2": "2", + "af-south-1": "2", + "me-south-1": "2", + "me-central-1": "2" }, "arm-php-82": { - "ca-central-1": "1", - "eu-central-1": "1", - "eu-north-1": "1", - "eu-west-1": "1", - "eu-west-2": "1", - "eu-west-3": "1", - "sa-east-1": "1", - "us-east-1": "1", - "us-east-2": "1", - "us-west-1": "1", - "us-west-2": "1", - "ap-east-1": "1", - "ap-south-1": "1", - "ap-northeast-1": "1", - "ap-northeast-2": "1", - "ap-northeast-3": "1", - "ap-southeast-1": "1", - "ap-southeast-2": "1", - "ap-southeast-3": "1", - "eu-south-1": "1", - "eu-south-2": "1", - "af-south-1": "1", - "me-south-1": "1", - "me-central-1": "1" + "ca-central-1": "2", + "eu-central-1": "2", + "eu-north-1": "2", + "eu-west-1": "2", + "eu-west-2": "2", + "eu-west-3": "2", + "sa-east-1": "2", + "us-east-1": "2", + "us-east-2": "2", + "us-west-1": "2", + "us-west-2": "2", + "ap-east-1": "2", + "ap-south-1": "2", + "ap-northeast-1": "2", + "ap-northeast-2": "2", + "ap-northeast-3": "2", + "ap-southeast-1": "2", + "ap-southeast-2": "2", + "ap-southeast-3": "2", + "eu-south-1": "2", + "eu-south-2": "2", + "af-south-1": "2", + "me-south-1": "2", + "me-central-1": "2" } } \ No newline at end of file From 24d73a253f911649f0d39a7d1dbc2a44f4f5c355 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Mon, 26 May 2025 20:26:06 +0200 Subject: [PATCH 11/53] Separate branch for v3 pull requests --- .github/workflows/update-layer-versions.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/update-layer-versions.yml b/.github/workflows/update-layer-versions.yml index 9cff6a441..a3618df7b 100644 --- a/.github/workflows/update-layer-versions.yml +++ b/.github/workflows/update-layer-versions.yml @@ -60,6 +60,6 @@ jobs: After merging, a new Bref release needs to be created. If you are using AWS Lambda layer ARNs, check out [runtimes.bref.sh](https://runtimes.bref.sh/) to see the latest ARNs. - branch: new-layer-versions + branch: new-layer-versions-v3 base: v3 # temporary until v3 becomes the main branch delete-branch: true # delete after merging or closing the PR From b66fa183bee20b02ad1427a78e638676a9dd9c1d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 26 May 2025 23:34:07 +0200 Subject: [PATCH 12/53] Update layer versions (#1959) Co-authored-by: mnapoli <720328+mnapoli@users.noreply.github.com> --- layers.json | 288 ++++++++++++++++++++++++++-------------------------- 1 file changed, 144 insertions(+), 144 deletions(-) diff --git a/layers.json b/layers.json index 9796e048c..6450273a0 100644 --- a/layers.json +++ b/layers.json @@ -1,158 +1,158 @@ { "php-84": { - "ca-central-1": "2", - "eu-central-1": "2", - "eu-north-1": "2", - "eu-west-1": "2", - "eu-west-2": "2", - "eu-west-3": "2", - "sa-east-1": "2", - "us-east-1": "2", - "us-east-2": "2", - "us-west-1": "2", - "us-west-2": "2", - "ap-east-1": "2", - "ap-south-1": "2", - "ap-northeast-1": "2", - "ap-northeast-2": "2", - "ap-northeast-3": "2", - "ap-southeast-1": "2", - "ap-southeast-2": "2", - "ap-southeast-3": "2", - "eu-south-1": "2", - "eu-south-2": "2", - "af-south-1": "2", - "me-south-1": "2", - "me-central-1": "2" + "ca-central-1": "3", + "eu-central-1": "3", + "eu-north-1": "3", + "eu-west-1": "3", + "eu-west-2": "3", + "eu-west-3": "3", + "sa-east-1": "3", + "us-east-1": "3", + "us-east-2": "3", + "us-west-1": "3", + "us-west-2": "3", + "ap-east-1": "3", + "ap-south-1": "3", + "ap-northeast-1": "3", + "ap-northeast-2": "3", + "ap-northeast-3": "3", + "ap-southeast-1": "3", + "ap-southeast-2": "3", + "ap-southeast-3": "3", + "eu-south-1": "3", + "eu-south-2": "3", + "af-south-1": "3", + "me-south-1": "3", + "me-central-1": "3" }, "php-83": { - "ca-central-1": "2", - "eu-central-1": "2", - "eu-north-1": "2", - "eu-west-1": "2", - "eu-west-2": "2", - "eu-west-3": "2", - "sa-east-1": "2", - "us-east-1": "2", - "us-east-2": "2", - "us-west-1": "2", - "us-west-2": "2", - "ap-east-1": "2", - "ap-south-1": "2", - "ap-northeast-1": "2", - "ap-northeast-2": "2", - "ap-northeast-3": "2", - "ap-southeast-1": "2", - "ap-southeast-2": "2", - "ap-southeast-3": "2", - "eu-south-1": "2", - "eu-south-2": "2", - "af-south-1": "2", - "me-south-1": "2", - "me-central-1": "2" + "ca-central-1": "3", + "eu-central-1": "3", + "eu-north-1": "3", + "eu-west-1": "3", + "eu-west-2": "3", + "eu-west-3": "3", + "sa-east-1": "3", + "us-east-1": "3", + "us-east-2": "3", + "us-west-1": "3", + "us-west-2": "3", + "ap-east-1": "3", + "ap-south-1": "3", + "ap-northeast-1": "3", + "ap-northeast-2": "3", + "ap-northeast-3": "3", + "ap-southeast-1": "3", + "ap-southeast-2": "3", + "ap-southeast-3": "3", + "eu-south-1": "3", + "eu-south-2": "3", + "af-south-1": "3", + "me-south-1": "3", + "me-central-1": "3" }, "php-82": { - "ca-central-1": "2", - "eu-central-1": "2", - "eu-north-1": "2", - "eu-west-1": "2", - "eu-west-2": "2", - "eu-west-3": "2", - "sa-east-1": "2", - "us-east-1": "2", - "us-east-2": "2", - "us-west-1": "2", - "us-west-2": "2", - "ap-east-1": "2", - "ap-south-1": "2", - "ap-northeast-1": "2", - "ap-northeast-2": "2", - "ap-northeast-3": "2", - "ap-southeast-1": "2", - "ap-southeast-2": "2", - "ap-southeast-3": "2", - "eu-south-1": "2", - "eu-south-2": "2", - "af-south-1": "2", - "me-south-1": "2", - "me-central-1": "2" + "ca-central-1": "3", + "eu-central-1": "3", + "eu-north-1": "3", + "eu-west-1": "3", + "eu-west-2": "3", + "eu-west-3": "3", + "sa-east-1": "3", + "us-east-1": "3", + "us-east-2": "3", + "us-west-1": "3", + "us-west-2": "3", + "ap-east-1": "3", + "ap-south-1": "3", + "ap-northeast-1": "3", + "ap-northeast-2": "3", + "ap-northeast-3": "3", + "ap-southeast-1": "3", + "ap-southeast-2": "3", + "ap-southeast-3": "3", + "eu-south-1": "3", + "eu-south-2": "3", + "af-south-1": "3", + "me-south-1": "3", + "me-central-1": "3" }, "arm-php-84": { - "ca-central-1": "2", - "eu-central-1": "2", - "eu-north-1": "2", - "eu-west-1": "2", - "eu-west-2": "2", - "eu-west-3": "2", - "sa-east-1": "2", - "us-east-1": "2", - "us-east-2": "2", - "us-west-1": "2", - "us-west-2": "2", - "ap-east-1": "2", - "ap-south-1": "2", - "ap-northeast-1": "2", - "ap-northeast-2": "2", - "ap-northeast-3": "2", - "ap-southeast-1": "2", - "ap-southeast-2": "2", - "ap-southeast-3": "2", - "eu-south-1": "2", - "eu-south-2": "2", - "af-south-1": "2", - "me-south-1": "2", - "me-central-1": "2" + "ca-central-1": "3", + "eu-central-1": "3", + "eu-north-1": "3", + "eu-west-1": "3", + "eu-west-2": "3", + "eu-west-3": "3", + "sa-east-1": "3", + "us-east-1": "3", + "us-east-2": "3", + "us-west-1": "3", + "us-west-2": "3", + "ap-east-1": "3", + "ap-south-1": "3", + "ap-northeast-1": "3", + "ap-northeast-2": "3", + "ap-northeast-3": "3", + "ap-southeast-1": "3", + "ap-southeast-2": "3", + "ap-southeast-3": "3", + "eu-south-1": "3", + "eu-south-2": "3", + "af-south-1": "3", + "me-south-1": "3", + "me-central-1": "3" }, "arm-php-83": { - "ca-central-1": "2", - "eu-central-1": "2", - "eu-north-1": "2", - "eu-west-1": "2", - "eu-west-2": "2", - "eu-west-3": "2", - "sa-east-1": "2", - "us-east-1": "2", - "us-east-2": "2", - "us-west-1": "2", - "us-west-2": "2", - "ap-east-1": "2", - "ap-south-1": "2", - "ap-northeast-1": "2", - "ap-northeast-2": "2", - "ap-northeast-3": "2", - "ap-southeast-1": "2", - "ap-southeast-2": "2", - "ap-southeast-3": "2", - "eu-south-1": "2", - "eu-south-2": "2", - "af-south-1": "2", - "me-south-1": "2", - "me-central-1": "2" + "ca-central-1": "3", + "eu-central-1": "3", + "eu-north-1": "3", + "eu-west-1": "3", + "eu-west-2": "3", + "eu-west-3": "3", + "sa-east-1": "3", + "us-east-1": "3", + "us-east-2": "3", + "us-west-1": "3", + "us-west-2": "3", + "ap-east-1": "3", + "ap-south-1": "3", + "ap-northeast-1": "3", + "ap-northeast-2": "3", + "ap-northeast-3": "3", + "ap-southeast-1": "3", + "ap-southeast-2": "3", + "ap-southeast-3": "3", + "eu-south-1": "3", + "eu-south-2": "3", + "af-south-1": "3", + "me-south-1": "3", + "me-central-1": "3" }, "arm-php-82": { - "ca-central-1": "2", - "eu-central-1": "2", - "eu-north-1": "2", - "eu-west-1": "2", - "eu-west-2": "2", - "eu-west-3": "2", - "sa-east-1": "2", - "us-east-1": "2", - "us-east-2": "2", - "us-west-1": "2", - "us-west-2": "2", - "ap-east-1": "2", - "ap-south-1": "2", - "ap-northeast-1": "2", - "ap-northeast-2": "2", - "ap-northeast-3": "2", - "ap-southeast-1": "2", - "ap-southeast-2": "2", - "ap-southeast-3": "2", - "eu-south-1": "2", - "eu-south-2": "2", - "af-south-1": "2", - "me-south-1": "2", - "me-central-1": "2" + "ca-central-1": "3", + "eu-central-1": "3", + "eu-north-1": "3", + "eu-west-1": "3", + "eu-west-2": "3", + "eu-west-3": "3", + "sa-east-1": "3", + "us-east-1": "3", + "us-east-2": "3", + "us-west-1": "3", + "us-west-2": "3", + "ap-east-1": "3", + "ap-south-1": "3", + "ap-northeast-1": "3", + "ap-northeast-2": "3", + "ap-northeast-3": "3", + "ap-southeast-1": "3", + "ap-southeast-2": "3", + "ap-southeast-3": "3", + "eu-south-1": "3", + "eu-south-2": "3", + "af-south-1": "3", + "me-south-1": "3", + "me-central-1": "3" } } \ No newline at end of file From 5e0447bfb5f2a5f575935f8f30edaccb0305969c Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Tue, 27 May 2025 18:36:02 +0200 Subject: [PATCH 13/53] Force `opcache.file_cache_only=0` for PHP-FPM --- src/FpmRuntime/FpmHandler.php | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/FpmRuntime/FpmHandler.php b/src/FpmRuntime/FpmHandler.php index 597f006b9..d5ba0e6f3 100644 --- a/src/FpmRuntime/FpmHandler.php +++ b/src/FpmRuntime/FpmHandler.php @@ -88,6 +88,11 @@ public function start(): void // Displaying errors in the HTTP response is a security risk '-d', 'display_errors=0', + // This setting is enabled by default for CLI invocations because it + // improves performance. We disable if it for PHP-FPM manually + // because it tanks performance by essentially disabling opcache + '-d', + 'opcache.file_cache_only=0', ], [], $pipes); if (! is_resource($resource)) { From 388f1874116b6d6d78e3435dafca862f528ce9c2 Mon Sep 17 00:00:00 2001 From: mnapoli <720328+mnapoli@users.noreply.github.com> Date: Thu, 21 Aug 2025 16:28:01 +0000 Subject: [PATCH 14/53] Update layer versions --- layers.json | 288 ++++++++++++++++++++++++++-------------------------- 1 file changed, 144 insertions(+), 144 deletions(-) diff --git a/layers.json b/layers.json index 6450273a0..d7992a3d7 100644 --- a/layers.json +++ b/layers.json @@ -1,158 +1,158 @@ { "php-84": { - "ca-central-1": "3", - "eu-central-1": "3", - "eu-north-1": "3", - "eu-west-1": "3", - "eu-west-2": "3", - "eu-west-3": "3", - "sa-east-1": "3", - "us-east-1": "3", - "us-east-2": "3", - "us-west-1": "3", - "us-west-2": "3", - "ap-east-1": "3", - "ap-south-1": "3", - "ap-northeast-1": "3", - "ap-northeast-2": "3", - "ap-northeast-3": "3", - "ap-southeast-1": "3", - "ap-southeast-2": "3", - "ap-southeast-3": "3", - "eu-south-1": "3", - "eu-south-2": "3", - "af-south-1": "3", - "me-south-1": "3", - "me-central-1": "3" + "ca-central-1": "4", + "eu-central-1": "4", + "eu-north-1": "4", + "eu-west-1": "4", + "eu-west-2": "4", + "eu-west-3": "4", + "sa-east-1": "4", + "us-east-1": "4", + "us-east-2": "4", + "us-west-1": "4", + "us-west-2": "4", + "ap-east-1": "4", + "ap-south-1": "4", + "ap-northeast-1": "4", + "ap-northeast-2": "4", + "ap-northeast-3": "4", + "ap-southeast-1": "4", + "ap-southeast-2": "4", + "ap-southeast-3": "4", + "eu-south-1": "4", + "eu-south-2": "4", + "af-south-1": "4", + "me-south-1": "4", + "me-central-1": "4" }, "php-83": { - "ca-central-1": "3", - "eu-central-1": "3", - "eu-north-1": "3", - "eu-west-1": "3", - "eu-west-2": "3", - "eu-west-3": "3", - "sa-east-1": "3", - "us-east-1": "3", - "us-east-2": "3", - "us-west-1": "3", - "us-west-2": "3", - "ap-east-1": "3", - "ap-south-1": "3", - "ap-northeast-1": "3", - "ap-northeast-2": "3", - "ap-northeast-3": "3", - "ap-southeast-1": "3", - "ap-southeast-2": "3", - "ap-southeast-3": "3", - "eu-south-1": "3", - "eu-south-2": "3", - "af-south-1": "3", - "me-south-1": "3", - "me-central-1": "3" + "ca-central-1": "4", + "eu-central-1": "4", + "eu-north-1": "4", + "eu-west-1": "4", + "eu-west-2": "4", + "eu-west-3": "4", + "sa-east-1": "4", + "us-east-1": "4", + "us-east-2": "4", + "us-west-1": "4", + "us-west-2": "4", + "ap-east-1": "4", + "ap-south-1": "4", + "ap-northeast-1": "4", + "ap-northeast-2": "4", + "ap-northeast-3": "4", + "ap-southeast-1": "4", + "ap-southeast-2": "4", + "ap-southeast-3": "4", + "eu-south-1": "4", + "eu-south-2": "4", + "af-south-1": "4", + "me-south-1": "4", + "me-central-1": "4" }, "php-82": { - "ca-central-1": "3", - "eu-central-1": "3", - "eu-north-1": "3", - "eu-west-1": "3", - "eu-west-2": "3", - "eu-west-3": "3", - "sa-east-1": "3", - "us-east-1": "3", - "us-east-2": "3", - "us-west-1": "3", - "us-west-2": "3", - "ap-east-1": "3", - "ap-south-1": "3", - "ap-northeast-1": "3", - "ap-northeast-2": "3", - "ap-northeast-3": "3", - "ap-southeast-1": "3", - "ap-southeast-2": "3", - "ap-southeast-3": "3", - "eu-south-1": "3", - "eu-south-2": "3", - "af-south-1": "3", - "me-south-1": "3", - "me-central-1": "3" + "ca-central-1": "4", + "eu-central-1": "4", + "eu-north-1": "4", + "eu-west-1": "4", + "eu-west-2": "4", + "eu-west-3": "4", + "sa-east-1": "4", + "us-east-1": "4", + "us-east-2": "4", + "us-west-1": "4", + "us-west-2": "4", + "ap-east-1": "4", + "ap-south-1": "4", + "ap-northeast-1": "4", + "ap-northeast-2": "4", + "ap-northeast-3": "4", + "ap-southeast-1": "4", + "ap-southeast-2": "4", + "ap-southeast-3": "4", + "eu-south-1": "4", + "eu-south-2": "4", + "af-south-1": "4", + "me-south-1": "4", + "me-central-1": "4" }, "arm-php-84": { - "ca-central-1": "3", - "eu-central-1": "3", - "eu-north-1": "3", - "eu-west-1": "3", - "eu-west-2": "3", - "eu-west-3": "3", - "sa-east-1": "3", - "us-east-1": "3", - "us-east-2": "3", - "us-west-1": "3", - "us-west-2": "3", - "ap-east-1": "3", - "ap-south-1": "3", - "ap-northeast-1": "3", - "ap-northeast-2": "3", - "ap-northeast-3": "3", - "ap-southeast-1": "3", - "ap-southeast-2": "3", - "ap-southeast-3": "3", - "eu-south-1": "3", - "eu-south-2": "3", - "af-south-1": "3", - "me-south-1": "3", - "me-central-1": "3" + "ca-central-1": "4", + "eu-central-1": "4", + "eu-north-1": "4", + "eu-west-1": "4", + "eu-west-2": "4", + "eu-west-3": "4", + "sa-east-1": "4", + "us-east-1": "4", + "us-east-2": "4", + "us-west-1": "4", + "us-west-2": "4", + "ap-east-1": "4", + "ap-south-1": "4", + "ap-northeast-1": "4", + "ap-northeast-2": "4", + "ap-northeast-3": "4", + "ap-southeast-1": "4", + "ap-southeast-2": "4", + "ap-southeast-3": "4", + "eu-south-1": "4", + "eu-south-2": "4", + "af-south-1": "4", + "me-south-1": "4", + "me-central-1": "4" }, "arm-php-83": { - "ca-central-1": "3", - "eu-central-1": "3", - "eu-north-1": "3", - "eu-west-1": "3", - "eu-west-2": "3", - "eu-west-3": "3", - "sa-east-1": "3", - "us-east-1": "3", - "us-east-2": "3", - "us-west-1": "3", - "us-west-2": "3", - "ap-east-1": "3", - "ap-south-1": "3", - "ap-northeast-1": "3", - "ap-northeast-2": "3", - "ap-northeast-3": "3", - "ap-southeast-1": "3", - "ap-southeast-2": "3", - "ap-southeast-3": "3", - "eu-south-1": "3", - "eu-south-2": "3", - "af-south-1": "3", - "me-south-1": "3", - "me-central-1": "3" + "ca-central-1": "4", + "eu-central-1": "4", + "eu-north-1": "4", + "eu-west-1": "4", + "eu-west-2": "4", + "eu-west-3": "4", + "sa-east-1": "4", + "us-east-1": "4", + "us-east-2": "4", + "us-west-1": "4", + "us-west-2": "4", + "ap-east-1": "4", + "ap-south-1": "4", + "ap-northeast-1": "4", + "ap-northeast-2": "4", + "ap-northeast-3": "4", + "ap-southeast-1": "4", + "ap-southeast-2": "4", + "ap-southeast-3": "4", + "eu-south-1": "4", + "eu-south-2": "4", + "af-south-1": "4", + "me-south-1": "4", + "me-central-1": "4" }, "arm-php-82": { - "ca-central-1": "3", - "eu-central-1": "3", - "eu-north-1": "3", - "eu-west-1": "3", - "eu-west-2": "3", - "eu-west-3": "3", - "sa-east-1": "3", - "us-east-1": "3", - "us-east-2": "3", - "us-west-1": "3", - "us-west-2": "3", - "ap-east-1": "3", - "ap-south-1": "3", - "ap-northeast-1": "3", - "ap-northeast-2": "3", - "ap-northeast-3": "3", - "ap-southeast-1": "3", - "ap-southeast-2": "3", - "ap-southeast-3": "3", - "eu-south-1": "3", - "eu-south-2": "3", - "af-south-1": "3", - "me-south-1": "3", - "me-central-1": "3" + "ca-central-1": "4", + "eu-central-1": "4", + "eu-north-1": "4", + "eu-west-1": "4", + "eu-west-2": "4", + "eu-west-3": "4", + "sa-east-1": "4", + "us-east-1": "4", + "us-east-2": "4", + "us-west-1": "4", + "us-west-2": "4", + "ap-east-1": "4", + "ap-south-1": "4", + "ap-northeast-1": "4", + "ap-northeast-2": "4", + "ap-northeast-3": "4", + "ap-southeast-1": "4", + "ap-southeast-2": "4", + "ap-southeast-3": "4", + "eu-south-1": "4", + "eu-south-2": "4", + "af-south-1": "4", + "me-south-1": "4", + "me-central-1": "4" } } \ No newline at end of file From 4b232204b2059622d3a197275c009ec2c5d67e34 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Fri, 22 Aug 2025 14:16:10 +0200 Subject: [PATCH 15/53] Fix PHPStan error --- src/LazySecretsLoader.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/LazySecretsLoader.php b/src/LazySecretsLoader.php index cc3f2b42a..338382ab6 100644 --- a/src/LazySecretsLoader.php +++ b/src/LazySecretsLoader.php @@ -36,7 +36,7 @@ public static function loadSecretEnvironmentVariables(): void private static function areThereSecretsToLoad(): bool { /** @var array|string|false $envVars */ - $envVars = getenv(local_only: true); // @phpstan-ignore-line PHPStan is wrong + $envVars = getenv(local_only: true); if (! is_array($envVars)) { return false; } From 7bc9e52ca933547521d4ec52cb03c3b27b665f8d Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Fri, 22 Aug 2025 14:13:51 +0200 Subject: [PATCH 16/53] Support PHP 8.5 --- .github/workflows/ci.yml | 2 +- docs/runtimes.mdx | 16 ++++++++++++---- index.js | 2 +- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index be146c2cd..f0bfb90bc 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,7 +16,7 @@ jobs: timeout-minutes: 15 strategy: matrix: - php: [ '8.4', '8.3', '8.2' ] + php: [ '8.5', '8.4', '8.3', '8.2' ] dependency-version: [ '' ] platform-reqs: [ '' ] include: diff --git a/docs/runtimes.mdx b/docs/runtimes.mdx index 552a4004d..49a0a85a6 100644 --- a/docs/runtimes.mdx +++ b/docs/runtimes.mdx @@ -23,7 +23,7 @@ The runtimes are available as AWS Lambda layers that you can use (explained belo ### PHP-FPM runtime for web apps -Name: `php-84-fpm`, `php-83-fpm`, and `php-82-fpm`. +Name: `php-85-fpm`, `php-84-fpm`, `php-83-fpm`, and `php-82-fpm`. This runtime uses PHP-FPM to run **web applications** on AWS Lambda, like on a traditional server. @@ -33,7 +33,7 @@ It's **the easiest to start with**: it works like traditional PHP hosting and is ### Event-driven functions -Name: `php-84`, `php-83`, and `php-82`. +Name: `php-85`, `php-84`, `php-83`, and `php-82`. AWS Lambda was initially created to run _functions_ (yes, functions of code) in the cloud. @@ -49,7 +49,7 @@ This runtime works great to create **event-driven micro-services**. ### Console -Name: `php-84-console`, `php-83-console`, and `php-82-console`. +Name: `php-85-console`, `php-84-console`, `php-83-console`, and `php-82-console`. This runtime lets you run CLI console commands on Lambda. @@ -77,13 +77,18 @@ functions: runtime: php-84-console ``` -Bref currently provides runtimes for PHP 8.2, 8.3, and 8.4: +Bref currently provides runtimes for PHP 8.2, 8.3, 8.4, and 8.5: +- `php-85` - `php-84` - `php-83` - `php-82` +- `php-85-fpm` +- `php-84-fpm` - `php-83-fpm` - `php-82-fpm` +- `php-85-console` +- `php-84-console` - `php-83-console` - `php-82-console` @@ -170,9 +175,12 @@ functions: The `${...}` notation is the [syntax to use variables](https://serverless.com/framework/docs/providers/aws/guide/variables/) in `serverless.yml`. The Bref plugin provides the following variables: +- `${bref:layer.php-85}` - `${bref:layer.php-84}` - `${bref:layer.php-83}` - `${bref:layer.php-82}` +- `${bref:layer.php-85-fpm}` +- `${bref:layer.php-84-fpm}` - `${bref:layer.php-83-fpm}` - `${bref:layer.php-82-fpm}` - `${bref:layer.console}` diff --git a/index.js b/index.js index a86b4a158..52c09a31c 100644 --- a/index.js +++ b/index.js @@ -47,7 +47,7 @@ class ServerlessPlugin { .filter(name => !name.startsWith('arm-')); // Console runtimes must have a PHP version provided this.runtimes = this.runtimes.filter(name => name !== 'console'); - this.runtimes.push('php-82-console', 'php-83-console', 'php-84-console'); + this.runtimes.push('php-82-console', 'php-83-console', 'php-84-console', 'php-85-console'); this.checkCompatibleRuntime(); From 7b0bb037de0bb067b4a640de975bc07fbb01b3af Mon Sep 17 00:00:00 2001 From: mnapoli <720328+mnapoli@users.noreply.github.com> Date: Fri, 22 Aug 2025 12:58:41 +0000 Subject: [PATCH 17/53] Update layer versions --- layers.json | 288 ++++++++++++++++++++++++++-------------------------- 1 file changed, 144 insertions(+), 144 deletions(-) diff --git a/layers.json b/layers.json index d7992a3d7..8f185d226 100644 --- a/layers.json +++ b/layers.json @@ -1,158 +1,158 @@ { "php-84": { - "ca-central-1": "4", - "eu-central-1": "4", - "eu-north-1": "4", - "eu-west-1": "4", - "eu-west-2": "4", - "eu-west-3": "4", - "sa-east-1": "4", - "us-east-1": "4", - "us-east-2": "4", - "us-west-1": "4", - "us-west-2": "4", - "ap-east-1": "4", - "ap-south-1": "4", - "ap-northeast-1": "4", - "ap-northeast-2": "4", - "ap-northeast-3": "4", - "ap-southeast-1": "4", - "ap-southeast-2": "4", - "ap-southeast-3": "4", - "eu-south-1": "4", - "eu-south-2": "4", - "af-south-1": "4", - "me-south-1": "4", - "me-central-1": "4" + "ca-central-1": "5", + "eu-central-1": "5", + "eu-north-1": "5", + "eu-west-1": "5", + "eu-west-2": "5", + "eu-west-3": "5", + "sa-east-1": "5", + "us-east-1": "5", + "us-east-2": "5", + "us-west-1": "5", + "us-west-2": "5", + "ap-east-1": "5", + "ap-south-1": "5", + "ap-northeast-1": "5", + "ap-northeast-2": "5", + "ap-northeast-3": "5", + "ap-southeast-1": "5", + "ap-southeast-2": "5", + "ap-southeast-3": "5", + "eu-south-1": "5", + "eu-south-2": "5", + "af-south-1": "5", + "me-south-1": "5", + "me-central-1": "5" }, "php-83": { - "ca-central-1": "4", - "eu-central-1": "4", - "eu-north-1": "4", - "eu-west-1": "4", - "eu-west-2": "4", - "eu-west-3": "4", - "sa-east-1": "4", - "us-east-1": "4", - "us-east-2": "4", - "us-west-1": "4", - "us-west-2": "4", - "ap-east-1": "4", - "ap-south-1": "4", - "ap-northeast-1": "4", - "ap-northeast-2": "4", - "ap-northeast-3": "4", - "ap-southeast-1": "4", - "ap-southeast-2": "4", - "ap-southeast-3": "4", - "eu-south-1": "4", - "eu-south-2": "4", - "af-south-1": "4", - "me-south-1": "4", - "me-central-1": "4" + "ca-central-1": "5", + "eu-central-1": "5", + "eu-north-1": "5", + "eu-west-1": "5", + "eu-west-2": "5", + "eu-west-3": "5", + "sa-east-1": "5", + "us-east-1": "5", + "us-east-2": "5", + "us-west-1": "5", + "us-west-2": "5", + "ap-east-1": "5", + "ap-south-1": "5", + "ap-northeast-1": "5", + "ap-northeast-2": "5", + "ap-northeast-3": "5", + "ap-southeast-1": "5", + "ap-southeast-2": "5", + "ap-southeast-3": "5", + "eu-south-1": "5", + "eu-south-2": "5", + "af-south-1": "5", + "me-south-1": "5", + "me-central-1": "5" }, "php-82": { - "ca-central-1": "4", - "eu-central-1": "4", - "eu-north-1": "4", - "eu-west-1": "4", - "eu-west-2": "4", - "eu-west-3": "4", - "sa-east-1": "4", - "us-east-1": "4", - "us-east-2": "4", - "us-west-1": "4", - "us-west-2": "4", - "ap-east-1": "4", - "ap-south-1": "4", - "ap-northeast-1": "4", - "ap-northeast-2": "4", - "ap-northeast-3": "4", - "ap-southeast-1": "4", - "ap-southeast-2": "4", - "ap-southeast-3": "4", - "eu-south-1": "4", - "eu-south-2": "4", - "af-south-1": "4", - "me-south-1": "4", - "me-central-1": "4" + "ca-central-1": "5", + "eu-central-1": "5", + "eu-north-1": "5", + "eu-west-1": "5", + "eu-west-2": "5", + "eu-west-3": "5", + "sa-east-1": "5", + "us-east-1": "5", + "us-east-2": "5", + "us-west-1": "5", + "us-west-2": "5", + "ap-east-1": "5", + "ap-south-1": "5", + "ap-northeast-1": "5", + "ap-northeast-2": "5", + "ap-northeast-3": "5", + "ap-southeast-1": "5", + "ap-southeast-2": "5", + "ap-southeast-3": "5", + "eu-south-1": "5", + "eu-south-2": "5", + "af-south-1": "5", + "me-south-1": "5", + "me-central-1": "5" }, "arm-php-84": { - "ca-central-1": "4", - "eu-central-1": "4", - "eu-north-1": "4", - "eu-west-1": "4", - "eu-west-2": "4", - "eu-west-3": "4", - "sa-east-1": "4", - "us-east-1": "4", - "us-east-2": "4", - "us-west-1": "4", - "us-west-2": "4", - "ap-east-1": "4", - "ap-south-1": "4", - "ap-northeast-1": "4", - "ap-northeast-2": "4", - "ap-northeast-3": "4", - "ap-southeast-1": "4", - "ap-southeast-2": "4", - "ap-southeast-3": "4", - "eu-south-1": "4", - "eu-south-2": "4", - "af-south-1": "4", - "me-south-1": "4", - "me-central-1": "4" + "ca-central-1": "5", + "eu-central-1": "5", + "eu-north-1": "5", + "eu-west-1": "5", + "eu-west-2": "5", + "eu-west-3": "5", + "sa-east-1": "5", + "us-east-1": "5", + "us-east-2": "5", + "us-west-1": "5", + "us-west-2": "5", + "ap-east-1": "5", + "ap-south-1": "5", + "ap-northeast-1": "5", + "ap-northeast-2": "5", + "ap-northeast-3": "5", + "ap-southeast-1": "5", + "ap-southeast-2": "5", + "ap-southeast-3": "5", + "eu-south-1": "5", + "eu-south-2": "5", + "af-south-1": "5", + "me-south-1": "5", + "me-central-1": "5" }, "arm-php-83": { - "ca-central-1": "4", - "eu-central-1": "4", - "eu-north-1": "4", - "eu-west-1": "4", - "eu-west-2": "4", - "eu-west-3": "4", - "sa-east-1": "4", - "us-east-1": "4", - "us-east-2": "4", - "us-west-1": "4", - "us-west-2": "4", - "ap-east-1": "4", - "ap-south-1": "4", - "ap-northeast-1": "4", - "ap-northeast-2": "4", - "ap-northeast-3": "4", - "ap-southeast-1": "4", - "ap-southeast-2": "4", - "ap-southeast-3": "4", - "eu-south-1": "4", - "eu-south-2": "4", - "af-south-1": "4", - "me-south-1": "4", - "me-central-1": "4" + "ca-central-1": "5", + "eu-central-1": "5", + "eu-north-1": "5", + "eu-west-1": "5", + "eu-west-2": "5", + "eu-west-3": "5", + "sa-east-1": "5", + "us-east-1": "5", + "us-east-2": "5", + "us-west-1": "5", + "us-west-2": "5", + "ap-east-1": "5", + "ap-south-1": "5", + "ap-northeast-1": "5", + "ap-northeast-2": "5", + "ap-northeast-3": "5", + "ap-southeast-1": "5", + "ap-southeast-2": "5", + "ap-southeast-3": "5", + "eu-south-1": "5", + "eu-south-2": "5", + "af-south-1": "5", + "me-south-1": "5", + "me-central-1": "5" }, "arm-php-82": { - "ca-central-1": "4", - "eu-central-1": "4", - "eu-north-1": "4", - "eu-west-1": "4", - "eu-west-2": "4", - "eu-west-3": "4", - "sa-east-1": "4", - "us-east-1": "4", - "us-east-2": "4", - "us-west-1": "4", - "us-west-2": "4", - "ap-east-1": "4", - "ap-south-1": "4", - "ap-northeast-1": "4", - "ap-northeast-2": "4", - "ap-northeast-3": "4", - "ap-southeast-1": "4", - "ap-southeast-2": "4", - "ap-southeast-3": "4", - "eu-south-1": "4", - "eu-south-2": "4", - "af-south-1": "4", - "me-south-1": "4", - "me-central-1": "4" + "ca-central-1": "5", + "eu-central-1": "5", + "eu-north-1": "5", + "eu-west-1": "5", + "eu-west-2": "5", + "eu-west-3": "5", + "sa-east-1": "5", + "us-east-1": "5", + "us-east-2": "5", + "us-west-1": "5", + "us-west-2": "5", + "ap-east-1": "5", + "ap-south-1": "5", + "ap-northeast-1": "5", + "ap-northeast-2": "5", + "ap-northeast-3": "5", + "ap-southeast-1": "5", + "ap-southeast-2": "5", + "ap-southeast-3": "5", + "eu-south-1": "5", + "eu-south-2": "5", + "af-south-1": "5", + "me-south-1": "5", + "me-central-1": "5" } } \ No newline at end of file From a5ff4ddb062596f6f132937b21df750aea43ec96 Mon Sep 17 00:00:00 2001 From: mnapoli <720328+mnapoli@users.noreply.github.com> Date: Fri, 22 Aug 2025 13:21:06 +0000 Subject: [PATCH 18/53] Update layer versions --- layers.json | 288 ++++++++++++++++++++++++++-------------------------- 1 file changed, 144 insertions(+), 144 deletions(-) diff --git a/layers.json b/layers.json index 8f185d226..18579b31a 100644 --- a/layers.json +++ b/layers.json @@ -1,158 +1,158 @@ { "php-84": { - "ca-central-1": "5", - "eu-central-1": "5", - "eu-north-1": "5", - "eu-west-1": "5", - "eu-west-2": "5", - "eu-west-3": "5", - "sa-east-1": "5", - "us-east-1": "5", - "us-east-2": "5", - "us-west-1": "5", - "us-west-2": "5", - "ap-east-1": "5", - "ap-south-1": "5", - "ap-northeast-1": "5", - "ap-northeast-2": "5", - "ap-northeast-3": "5", - "ap-southeast-1": "5", - "ap-southeast-2": "5", - "ap-southeast-3": "5", - "eu-south-1": "5", - "eu-south-2": "5", - "af-south-1": "5", - "me-south-1": "5", - "me-central-1": "5" + "ca-central-1": "6", + "eu-central-1": "6", + "eu-north-1": "6", + "eu-west-1": "6", + "eu-west-2": "6", + "eu-west-3": "6", + "sa-east-1": "6", + "us-east-1": "6", + "us-east-2": "6", + "us-west-1": "6", + "us-west-2": "6", + "ap-east-1": "6", + "ap-south-1": "6", + "ap-northeast-1": "6", + "ap-northeast-2": "6", + "ap-northeast-3": "6", + "ap-southeast-1": "6", + "ap-southeast-2": "6", + "ap-southeast-3": "6", + "eu-south-1": "6", + "eu-south-2": "6", + "af-south-1": "6", + "me-south-1": "6", + "me-central-1": "6" }, "php-83": { - "ca-central-1": "5", - "eu-central-1": "5", - "eu-north-1": "5", - "eu-west-1": "5", - "eu-west-2": "5", - "eu-west-3": "5", - "sa-east-1": "5", - "us-east-1": "5", - "us-east-2": "5", - "us-west-1": "5", - "us-west-2": "5", - "ap-east-1": "5", - "ap-south-1": "5", - "ap-northeast-1": "5", - "ap-northeast-2": "5", - "ap-northeast-3": "5", - "ap-southeast-1": "5", - "ap-southeast-2": "5", - "ap-southeast-3": "5", - "eu-south-1": "5", - "eu-south-2": "5", - "af-south-1": "5", - "me-south-1": "5", - "me-central-1": "5" + "ca-central-1": "6", + "eu-central-1": "6", + "eu-north-1": "6", + "eu-west-1": "6", + "eu-west-2": "6", + "eu-west-3": "6", + "sa-east-1": "6", + "us-east-1": "6", + "us-east-2": "6", + "us-west-1": "6", + "us-west-2": "6", + "ap-east-1": "6", + "ap-south-1": "6", + "ap-northeast-1": "6", + "ap-northeast-2": "6", + "ap-northeast-3": "6", + "ap-southeast-1": "6", + "ap-southeast-2": "6", + "ap-southeast-3": "6", + "eu-south-1": "6", + "eu-south-2": "6", + "af-south-1": "6", + "me-south-1": "6", + "me-central-1": "6" }, "php-82": { - "ca-central-1": "5", - "eu-central-1": "5", - "eu-north-1": "5", - "eu-west-1": "5", - "eu-west-2": "5", - "eu-west-3": "5", - "sa-east-1": "5", - "us-east-1": "5", - "us-east-2": "5", - "us-west-1": "5", - "us-west-2": "5", - "ap-east-1": "5", - "ap-south-1": "5", - "ap-northeast-1": "5", - "ap-northeast-2": "5", - "ap-northeast-3": "5", - "ap-southeast-1": "5", - "ap-southeast-2": "5", - "ap-southeast-3": "5", - "eu-south-1": "5", - "eu-south-2": "5", - "af-south-1": "5", - "me-south-1": "5", - "me-central-1": "5" + "ca-central-1": "6", + "eu-central-1": "6", + "eu-north-1": "6", + "eu-west-1": "6", + "eu-west-2": "6", + "eu-west-3": "6", + "sa-east-1": "6", + "us-east-1": "6", + "us-east-2": "6", + "us-west-1": "6", + "us-west-2": "6", + "ap-east-1": "6", + "ap-south-1": "6", + "ap-northeast-1": "6", + "ap-northeast-2": "6", + "ap-northeast-3": "6", + "ap-southeast-1": "6", + "ap-southeast-2": "6", + "ap-southeast-3": "6", + "eu-south-1": "6", + "eu-south-2": "6", + "af-south-1": "6", + "me-south-1": "6", + "me-central-1": "6" }, "arm-php-84": { - "ca-central-1": "5", - "eu-central-1": "5", - "eu-north-1": "5", - "eu-west-1": "5", - "eu-west-2": "5", - "eu-west-3": "5", - "sa-east-1": "5", - "us-east-1": "5", - "us-east-2": "5", - "us-west-1": "5", - "us-west-2": "5", - "ap-east-1": "5", - "ap-south-1": "5", - "ap-northeast-1": "5", - "ap-northeast-2": "5", - "ap-northeast-3": "5", - "ap-southeast-1": "5", - "ap-southeast-2": "5", - "ap-southeast-3": "5", - "eu-south-1": "5", - "eu-south-2": "5", - "af-south-1": "5", - "me-south-1": "5", - "me-central-1": "5" + "ca-central-1": "6", + "eu-central-1": "6", + "eu-north-1": "6", + "eu-west-1": "6", + "eu-west-2": "6", + "eu-west-3": "6", + "sa-east-1": "6", + "us-east-1": "6", + "us-east-2": "6", + "us-west-1": "6", + "us-west-2": "6", + "ap-east-1": "6", + "ap-south-1": "6", + "ap-northeast-1": "6", + "ap-northeast-2": "6", + "ap-northeast-3": "6", + "ap-southeast-1": "6", + "ap-southeast-2": "6", + "ap-southeast-3": "6", + "eu-south-1": "6", + "eu-south-2": "6", + "af-south-1": "6", + "me-south-1": "6", + "me-central-1": "6" }, "arm-php-83": { - "ca-central-1": "5", - "eu-central-1": "5", - "eu-north-1": "5", - "eu-west-1": "5", - "eu-west-2": "5", - "eu-west-3": "5", - "sa-east-1": "5", - "us-east-1": "5", - "us-east-2": "5", - "us-west-1": "5", - "us-west-2": "5", - "ap-east-1": "5", - "ap-south-1": "5", - "ap-northeast-1": "5", - "ap-northeast-2": "5", - "ap-northeast-3": "5", - "ap-southeast-1": "5", - "ap-southeast-2": "5", - "ap-southeast-3": "5", - "eu-south-1": "5", - "eu-south-2": "5", - "af-south-1": "5", - "me-south-1": "5", - "me-central-1": "5" + "ca-central-1": "6", + "eu-central-1": "6", + "eu-north-1": "6", + "eu-west-1": "6", + "eu-west-2": "6", + "eu-west-3": "6", + "sa-east-1": "6", + "us-east-1": "6", + "us-east-2": "6", + "us-west-1": "6", + "us-west-2": "6", + "ap-east-1": "6", + "ap-south-1": "6", + "ap-northeast-1": "6", + "ap-northeast-2": "6", + "ap-northeast-3": "6", + "ap-southeast-1": "6", + "ap-southeast-2": "6", + "ap-southeast-3": "6", + "eu-south-1": "6", + "eu-south-2": "6", + "af-south-1": "6", + "me-south-1": "6", + "me-central-1": "6" }, "arm-php-82": { - "ca-central-1": "5", - "eu-central-1": "5", - "eu-north-1": "5", - "eu-west-1": "5", - "eu-west-2": "5", - "eu-west-3": "5", - "sa-east-1": "5", - "us-east-1": "5", - "us-east-2": "5", - "us-west-1": "5", - "us-west-2": "5", - "ap-east-1": "5", - "ap-south-1": "5", - "ap-northeast-1": "5", - "ap-northeast-2": "5", - "ap-northeast-3": "5", - "ap-southeast-1": "5", - "ap-southeast-2": "5", - "ap-southeast-3": "5", - "eu-south-1": "5", - "eu-south-2": "5", - "af-south-1": "5", - "me-south-1": "5", - "me-central-1": "5" + "ca-central-1": "6", + "eu-central-1": "6", + "eu-north-1": "6", + "eu-west-1": "6", + "eu-west-2": "6", + "eu-west-3": "6", + "sa-east-1": "6", + "us-east-1": "6", + "us-east-2": "6", + "us-west-1": "6", + "us-west-2": "6", + "ap-east-1": "6", + "ap-south-1": "6", + "ap-northeast-1": "6", + "ap-northeast-2": "6", + "ap-northeast-3": "6", + "ap-southeast-1": "6", + "ap-southeast-2": "6", + "ap-southeast-3": "6", + "eu-south-1": "6", + "eu-south-2": "6", + "af-south-1": "6", + "me-south-1": "6", + "me-central-1": "6" } } \ No newline at end of file From da8ed086aa47e7fe3be8bf1e4d41416c4e071888 Mon Sep 17 00:00:00 2001 From: mnapoli <720328+mnapoli@users.noreply.github.com> Date: Sun, 24 Aug 2025 19:55:54 +0000 Subject: [PATCH 19/53] Update layer versions --- layers.json | 288 ++++++++++++++++++++++++++-------------------------- 1 file changed, 144 insertions(+), 144 deletions(-) diff --git a/layers.json b/layers.json index 18579b31a..e67205027 100644 --- a/layers.json +++ b/layers.json @@ -1,158 +1,158 @@ { "php-84": { - "ca-central-1": "6", - "eu-central-1": "6", - "eu-north-1": "6", - "eu-west-1": "6", - "eu-west-2": "6", - "eu-west-3": "6", - "sa-east-1": "6", - "us-east-1": "6", - "us-east-2": "6", - "us-west-1": "6", - "us-west-2": "6", - "ap-east-1": "6", - "ap-south-1": "6", - "ap-northeast-1": "6", - "ap-northeast-2": "6", - "ap-northeast-3": "6", - "ap-southeast-1": "6", - "ap-southeast-2": "6", - "ap-southeast-3": "6", - "eu-south-1": "6", - "eu-south-2": "6", - "af-south-1": "6", - "me-south-1": "6", - "me-central-1": "6" + "ca-central-1": "7", + "eu-central-1": "7", + "eu-north-1": "7", + "eu-west-1": "7", + "eu-west-2": "7", + "eu-west-3": "7", + "sa-east-1": "7", + "us-east-1": "7", + "us-east-2": "7", + "us-west-1": "7", + "us-west-2": "7", + "ap-east-1": "7", + "ap-south-1": "7", + "ap-northeast-1": "7", + "ap-northeast-2": "7", + "ap-northeast-3": "7", + "ap-southeast-1": "7", + "ap-southeast-2": "7", + "ap-southeast-3": "7", + "eu-south-1": "7", + "eu-south-2": "7", + "af-south-1": "7", + "me-south-1": "7", + "me-central-1": "7" }, "php-83": { - "ca-central-1": "6", - "eu-central-1": "6", - "eu-north-1": "6", - "eu-west-1": "6", - "eu-west-2": "6", - "eu-west-3": "6", - "sa-east-1": "6", - "us-east-1": "6", - "us-east-2": "6", - "us-west-1": "6", - "us-west-2": "6", - "ap-east-1": "6", - "ap-south-1": "6", - "ap-northeast-1": "6", - "ap-northeast-2": "6", - "ap-northeast-3": "6", - "ap-southeast-1": "6", - "ap-southeast-2": "6", - "ap-southeast-3": "6", - "eu-south-1": "6", - "eu-south-2": "6", - "af-south-1": "6", - "me-south-1": "6", - "me-central-1": "6" + "ca-central-1": "7", + "eu-central-1": "7", + "eu-north-1": "7", + "eu-west-1": "7", + "eu-west-2": "7", + "eu-west-3": "7", + "sa-east-1": "7", + "us-east-1": "7", + "us-east-2": "7", + "us-west-1": "7", + "us-west-2": "7", + "ap-east-1": "7", + "ap-south-1": "7", + "ap-northeast-1": "7", + "ap-northeast-2": "7", + "ap-northeast-3": "7", + "ap-southeast-1": "7", + "ap-southeast-2": "7", + "ap-southeast-3": "7", + "eu-south-1": "7", + "eu-south-2": "7", + "af-south-1": "7", + "me-south-1": "7", + "me-central-1": "7" }, "php-82": { - "ca-central-1": "6", - "eu-central-1": "6", - "eu-north-1": "6", - "eu-west-1": "6", - "eu-west-2": "6", - "eu-west-3": "6", - "sa-east-1": "6", - "us-east-1": "6", - "us-east-2": "6", - "us-west-1": "6", - "us-west-2": "6", - "ap-east-1": "6", - "ap-south-1": "6", - "ap-northeast-1": "6", - "ap-northeast-2": "6", - "ap-northeast-3": "6", - "ap-southeast-1": "6", - "ap-southeast-2": "6", - "ap-southeast-3": "6", - "eu-south-1": "6", - "eu-south-2": "6", - "af-south-1": "6", - "me-south-1": "6", - "me-central-1": "6" + "ca-central-1": "7", + "eu-central-1": "7", + "eu-north-1": "7", + "eu-west-1": "7", + "eu-west-2": "7", + "eu-west-3": "7", + "sa-east-1": "7", + "us-east-1": "7", + "us-east-2": "7", + "us-west-1": "7", + "us-west-2": "7", + "ap-east-1": "7", + "ap-south-1": "7", + "ap-northeast-1": "7", + "ap-northeast-2": "7", + "ap-northeast-3": "7", + "ap-southeast-1": "7", + "ap-southeast-2": "7", + "ap-southeast-3": "7", + "eu-south-1": "7", + "eu-south-2": "7", + "af-south-1": "7", + "me-south-1": "7", + "me-central-1": "7" }, "arm-php-84": { - "ca-central-1": "6", - "eu-central-1": "6", - "eu-north-1": "6", - "eu-west-1": "6", - "eu-west-2": "6", - "eu-west-3": "6", - "sa-east-1": "6", - "us-east-1": "6", - "us-east-2": "6", - "us-west-1": "6", - "us-west-2": "6", - "ap-east-1": "6", - "ap-south-1": "6", - "ap-northeast-1": "6", - "ap-northeast-2": "6", - "ap-northeast-3": "6", - "ap-southeast-1": "6", - "ap-southeast-2": "6", - "ap-southeast-3": "6", - "eu-south-1": "6", - "eu-south-2": "6", - "af-south-1": "6", - "me-south-1": "6", - "me-central-1": "6" + "ca-central-1": "7", + "eu-central-1": "7", + "eu-north-1": "7", + "eu-west-1": "7", + "eu-west-2": "7", + "eu-west-3": "7", + "sa-east-1": "7", + "us-east-1": "7", + "us-east-2": "7", + "us-west-1": "7", + "us-west-2": "7", + "ap-east-1": "7", + "ap-south-1": "7", + "ap-northeast-1": "7", + "ap-northeast-2": "7", + "ap-northeast-3": "7", + "ap-southeast-1": "7", + "ap-southeast-2": "7", + "ap-southeast-3": "7", + "eu-south-1": "7", + "eu-south-2": "7", + "af-south-1": "7", + "me-south-1": "7", + "me-central-1": "7" }, "arm-php-83": { - "ca-central-1": "6", - "eu-central-1": "6", - "eu-north-1": "6", - "eu-west-1": "6", - "eu-west-2": "6", - "eu-west-3": "6", - "sa-east-1": "6", - "us-east-1": "6", - "us-east-2": "6", - "us-west-1": "6", - "us-west-2": "6", - "ap-east-1": "6", - "ap-south-1": "6", - "ap-northeast-1": "6", - "ap-northeast-2": "6", - "ap-northeast-3": "6", - "ap-southeast-1": "6", - "ap-southeast-2": "6", - "ap-southeast-3": "6", - "eu-south-1": "6", - "eu-south-2": "6", - "af-south-1": "6", - "me-south-1": "6", - "me-central-1": "6" + "ca-central-1": "7", + "eu-central-1": "7", + "eu-north-1": "7", + "eu-west-1": "7", + "eu-west-2": "7", + "eu-west-3": "7", + "sa-east-1": "7", + "us-east-1": "7", + "us-east-2": "7", + "us-west-1": "7", + "us-west-2": "7", + "ap-east-1": "7", + "ap-south-1": "7", + "ap-northeast-1": "7", + "ap-northeast-2": "7", + "ap-northeast-3": "7", + "ap-southeast-1": "7", + "ap-southeast-2": "7", + "ap-southeast-3": "7", + "eu-south-1": "7", + "eu-south-2": "7", + "af-south-1": "7", + "me-south-1": "7", + "me-central-1": "7" }, "arm-php-82": { - "ca-central-1": "6", - "eu-central-1": "6", - "eu-north-1": "6", - "eu-west-1": "6", - "eu-west-2": "6", - "eu-west-3": "6", - "sa-east-1": "6", - "us-east-1": "6", - "us-east-2": "6", - "us-west-1": "6", - "us-west-2": "6", - "ap-east-1": "6", - "ap-south-1": "6", - "ap-northeast-1": "6", - "ap-northeast-2": "6", - "ap-northeast-3": "6", - "ap-southeast-1": "6", - "ap-southeast-2": "6", - "ap-southeast-3": "6", - "eu-south-1": "6", - "eu-south-2": "6", - "af-south-1": "6", - "me-south-1": "6", - "me-central-1": "6" + "ca-central-1": "7", + "eu-central-1": "7", + "eu-north-1": "7", + "eu-west-1": "7", + "eu-west-2": "7", + "eu-west-3": "7", + "sa-east-1": "7", + "us-east-1": "7", + "us-east-2": "7", + "us-west-1": "7", + "us-west-2": "7", + "ap-east-1": "7", + "ap-south-1": "7", + "ap-northeast-1": "7", + "ap-northeast-2": "7", + "ap-northeast-3": "7", + "ap-southeast-1": "7", + "ap-southeast-2": "7", + "ap-southeast-3": "7", + "eu-south-1": "7", + "eu-south-2": "7", + "af-south-1": "7", + "me-south-1": "7", + "me-central-1": "7" } } \ No newline at end of file From d500a5b45a9bcf9eedd86d0815e4441a66b8d0b6 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sun, 24 Aug 2025 21:26:34 +0200 Subject: [PATCH 20/53] Support PHP 8.5 in `layers.json` --- utils/layers.json/update.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/utils/layers.json/update.php b/utils/layers.json/update.php index 1f261efbd..0897e8abf 100644 --- a/utils/layers.json/update.php +++ b/utils/layers.json/update.php @@ -13,9 +13,11 @@ require_once __DIR__ . '/../../vendor/autoload.php'; const LAYER_NAMES = [ + 'php-85', 'php-84', 'php-83', 'php-82', + 'arm-php-85', 'arm-php-84', 'arm-php-83', 'arm-php-82', From 4218f481335c1f4963ae456f28815821f96f2031 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sun, 24 Aug 2025 21:29:00 +0200 Subject: [PATCH 21/53] Fix runtime validation --- index.js | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/index.js b/index.js index 52c09a31c..8c84c4053 100644 --- a/index.js +++ b/index.js @@ -43,15 +43,22 @@ class ServerlessPlugin { /** @type {Record>} */ this.layers = JSON.parse(fs.readFileSync(filename).toString()); - this.runtimes = Object.keys(this.layers) - .filter(name => !name.startsWith('arm-')); - // Console runtimes must have a PHP version provided - this.runtimes = this.runtimes.filter(name => name !== 'console'); - this.runtimes.push('php-82-console', 'php-83-console', 'php-84-console', 'php-85-console'); - this.checkCompatibleRuntime(); - serverless.configSchemaHandler.schema.definitions.awsLambdaRuntime.enum.push(...this.runtimes); + serverless.configSchemaHandler.schema.definitions.awsLambdaRuntime.enum.push(...[ + 'php-82', + 'php-83', + 'php-84', + 'php-85', + 'php-82-fpm', + 'php-83-fpm', + 'php-84-fpm', + 'php-85-fpm', + 'php-82-console', + 'php-83-console', + 'php-84-console', + 'php-85-console', + ]); serverless.configSchemaHandler.defineTopLevelProperty('bref', { type: 'object', }); @@ -237,7 +244,6 @@ class ServerlessPlugin { const config = this.serverless.service; const isArmGlobally = config.provider.architecture === 'arm64'; - const isBrefRuntimeGlobally = this.runtimes.includes(config.provider.runtime || ''); // Check functions config for (const f of Object.values(config.functions || {})) { From 673f4b3b2e3940843a41fad406e135345aca3f51 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sun, 24 Aug 2025 21:29:36 +0200 Subject: [PATCH 22/53] Switch to AL2023 --- index.js | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/index.js b/index.js index 8c84c4053..3b7670411 100644 --- a/index.js +++ b/index.js @@ -177,7 +177,7 @@ class ServerlessPlugin { } /** - * Process the `php-xx` runtimes to turn them into `provided.al2` runtimes + Bref layers. + * Process the `php-xx` runtimes to turn them into `provided.al2023` runtimes + Bref layers. */ processPhpRuntimes() { const includeBrefLayers = (existingLayers, phpVersion, isArm) => { @@ -230,7 +230,7 @@ class ServerlessPlugin { phpVersion, f.architecture === 'arm64' || (isArmGlobally && !f.architecture), ); - f.runtime = 'provided.al2'; + f.runtime = 'provided.al2023'; // Add the `BREF_RUNTIME` environment variable // to let the function know which runtime it is using // (this is used by the Bref runtime) @@ -261,13 +261,20 @@ class ServerlessPlugin { } checkCompatibleRuntime() { - const errorMessage = 'Bref layers are not compatible with the "provided" runtime.\nYou have to use the "provided.al2" runtime instead in serverless.yml.\nMore details here: https://bref.sh/docs/news/01-bref-1.0.html#amazon-linux-2'; + const providedErrorMessage = 'Bref layers are not compatible with the "provided" runtime.\nYou have to use the "provided.al2023" runtime instead in serverless.yml.\nMore details here: https://bref.sh/docs/news/01-bref-1.0.html#amazon-linux-2'; + const providdeAl2ErrorMessage = 'Bref layers are not compatible with the "provided" runtime.\nYou have to use the "provided.al2023" runtime instead in serverless.yml.\nMore details here: https://bref.sh/docs/news/01-bref-1.0.html#amazon-linux-2'; if (this.serverless.service.provider.runtime === 'provided') { - throw new this.serverless.classes.Error(errorMessage); + throw new this.serverless.classes.Error(providedErrorMessage); + } + if (this.serverless.service.provider.runtime === 'provided.al2') { + throw new this.serverless.classes.Error(providdeAl2ErrorMessage); } for (const [, f] of Object.entries(this.serverless.service.functions || {})) { if (f.runtime === 'provided') { - throw new this.serverless.classes.Error(errorMessage); + throw new this.serverless.classes.Error(providedErrorMessage); + } + if (f.runtime === 'provided.al2') { + throw new this.serverless.classes.Error(providdeAl2ErrorMessage); } } } From 015861e082b7a6903c901f8fa7143fef07b57821 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Mon, 25 Aug 2025 10:32:27 +0200 Subject: [PATCH 23/53] Run tests on v3 --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f0bfb90bc..d04ad459e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,7 +2,7 @@ name: CI on: push: - branches: ['master'] + branches: ['master', 'v3'] pull_request: branches: ['*'] schedule: From 5196c643bb91dfd970b07530d456f625c716f17e Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Mon, 25 Aug 2025 10:45:59 +0200 Subject: [PATCH 24/53] Fix tests --- tests/PluginTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/PluginTest.php b/tests/PluginTest.php index debcae0a5..22684ff5d 100644 --- a/tests/PluginTest.php +++ b/tests/PluginTest.php @@ -114,7 +114,7 @@ private function slsPrint(string $configFile): array private static function assertFunction(array $config, string $brefRuntime, array $layers): void { - self::assertEquals('provided.al2', $config['runtime']); + self::assertEquals('provided.al2023', $config['runtime']); self::assertEquals($brefRuntime, $config['environment']['BREF_RUNTIME']); self::assertCount(count($layers), $config['layers'], sprintf('Expected %d layers, got %d: %s', count($layers), count($config['layers']), json_encode($config['layers'], JSON_THROW_ON_ERROR))); foreach ($layers as $index => $layer) { From 8596f373c34e8726b701d8b2383d2e2542af7520 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Fri, 12 Sep 2025 18:20:08 +0200 Subject: [PATCH 25/53] Document extension changes for Bref v3 --- docs/environment/php.mdx | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/environment/php.mdx b/docs/environment/php.mdx index 035a8aaec..3c2295656 100644 --- a/docs/environment/php.mdx +++ b/docs/environment/php.mdx @@ -73,6 +73,7 @@ The following extensions are installed and enabled by default in Bref runtimes:
  • PDO
  • pdo_sqlite
  • pdo_mysql
  • +
  • pdo_pgsql
  • Phar
  • posix
  • readline
  • @@ -98,14 +99,16 @@ The following extensions are installed in Bref runtimes, but disabled by default - **[intl](https://www.php.net/manual/en/intro.intl.php)** - Internationalization extension (referred as Intl) is a wrapper for ICU library, enabling PHP programmers to perform various locale-aware operations. - **[APCu](https://www.php.net/manual/en/intro.apcu.php)** - APCu is APC stripped of opcode caching. -- **[PostgreSQL PDO Driver](https://www.php.net/manual/en/ref.pdo-pgsql.php)** - PDO_PGSQL is a driver that implements the PHP Data Objects (PDO) interface to enable access from PHP to PostgreSQL databases. +- **[Redis](https://github.com/phpredis/phpredis)** - A PHP extension for interfacing with Redis. +- **[soap](https://www.php.net/manual/en/book.soap.php)** - SOAP client and server for PHP You can enable these extensions by loading them in `php/conf.d/php.ini` (as mentioned in [the section above](#phpini)), for example: ```ini filename="php/conf.d/php.ini" extension=intl extension=apcu -extension=pdo_pgsql +extension=redis +extension=soap ``` ### Extra extensions From d27458d0e1439adb49466ff56f8b196f0e9bbfc0 Mon Sep 17 00:00:00 2001 From: mnapoli <720328+mnapoli@users.noreply.github.com> Date: Fri, 12 Sep 2025 16:35:48 +0000 Subject: [PATCH 26/53] Update layer versions --- layers.json | 340 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 196 insertions(+), 144 deletions(-) diff --git a/layers.json b/layers.json index e67205027..8d7866687 100644 --- a/layers.json +++ b/layers.json @@ -1,158 +1,210 @@ { + "php-85": { + "ca-central-1": "5", + "eu-central-1": "5", + "eu-north-1": "5", + "eu-west-1": "5", + "eu-west-2": "5", + "eu-west-3": "5", + "sa-east-1": "5", + "us-east-1": "5", + "us-east-2": "5", + "us-west-1": "5", + "us-west-2": "5", + "ap-east-1": "5", + "ap-south-1": "5", + "ap-northeast-1": "5", + "ap-northeast-2": "5", + "ap-northeast-3": "5", + "ap-southeast-1": "5", + "ap-southeast-2": "5", + "ap-southeast-3": "5", + "eu-south-1": "5", + "eu-south-2": "5", + "af-south-1": "5", + "me-south-1": "5", + "me-central-1": "5" + }, "php-84": { - "ca-central-1": "7", - "eu-central-1": "7", - "eu-north-1": "7", - "eu-west-1": "7", - "eu-west-2": "7", - "eu-west-3": "7", - "sa-east-1": "7", - "us-east-1": "7", - "us-east-2": "7", - "us-west-1": "7", - "us-west-2": "7", - "ap-east-1": "7", - "ap-south-1": "7", - "ap-northeast-1": "7", - "ap-northeast-2": "7", - "ap-northeast-3": "7", - "ap-southeast-1": "7", - "ap-southeast-2": "7", - "ap-southeast-3": "7", - "eu-south-1": "7", - "eu-south-2": "7", - "af-south-1": "7", - "me-south-1": "7", - "me-central-1": "7" + "ca-central-1": "8", + "eu-central-1": "8", + "eu-north-1": "8", + "eu-west-1": "8", + "eu-west-2": "8", + "eu-west-3": "8", + "sa-east-1": "8", + "us-east-1": "8", + "us-east-2": "8", + "us-west-1": "8", + "us-west-2": "8", + "ap-east-1": "8", + "ap-south-1": "8", + "ap-northeast-1": "8", + "ap-northeast-2": "8", + "ap-northeast-3": "8", + "ap-southeast-1": "8", + "ap-southeast-2": "8", + "ap-southeast-3": "8", + "eu-south-1": "8", + "eu-south-2": "8", + "af-south-1": "8", + "me-south-1": "8", + "me-central-1": "8" }, "php-83": { - "ca-central-1": "7", - "eu-central-1": "7", - "eu-north-1": "7", - "eu-west-1": "7", - "eu-west-2": "7", - "eu-west-3": "7", - "sa-east-1": "7", - "us-east-1": "7", - "us-east-2": "7", - "us-west-1": "7", - "us-west-2": "7", - "ap-east-1": "7", - "ap-south-1": "7", - "ap-northeast-1": "7", - "ap-northeast-2": "7", - "ap-northeast-3": "7", - "ap-southeast-1": "7", - "ap-southeast-2": "7", - "ap-southeast-3": "7", - "eu-south-1": "7", - "eu-south-2": "7", - "af-south-1": "7", - "me-south-1": "7", - "me-central-1": "7" + "ca-central-1": "8", + "eu-central-1": "8", + "eu-north-1": "8", + "eu-west-1": "8", + "eu-west-2": "8", + "eu-west-3": "8", + "sa-east-1": "8", + "us-east-1": "8", + "us-east-2": "8", + "us-west-1": "8", + "us-west-2": "8", + "ap-east-1": "8", + "ap-south-1": "8", + "ap-northeast-1": "8", + "ap-northeast-2": "8", + "ap-northeast-3": "8", + "ap-southeast-1": "8", + "ap-southeast-2": "8", + "ap-southeast-3": "8", + "eu-south-1": "8", + "eu-south-2": "8", + "af-south-1": "8", + "me-south-1": "8", + "me-central-1": "8" }, "php-82": { - "ca-central-1": "7", - "eu-central-1": "7", - "eu-north-1": "7", - "eu-west-1": "7", - "eu-west-2": "7", - "eu-west-3": "7", - "sa-east-1": "7", - "us-east-1": "7", - "us-east-2": "7", - "us-west-1": "7", - "us-west-2": "7", - "ap-east-1": "7", - "ap-south-1": "7", - "ap-northeast-1": "7", - "ap-northeast-2": "7", - "ap-northeast-3": "7", - "ap-southeast-1": "7", - "ap-southeast-2": "7", - "ap-southeast-3": "7", - "eu-south-1": "7", - "eu-south-2": "7", - "af-south-1": "7", - "me-south-1": "7", - "me-central-1": "7" + "ca-central-1": "8", + "eu-central-1": "8", + "eu-north-1": "8", + "eu-west-1": "8", + "eu-west-2": "8", + "eu-west-3": "8", + "sa-east-1": "8", + "us-east-1": "8", + "us-east-2": "8", + "us-west-1": "8", + "us-west-2": "8", + "ap-east-1": "8", + "ap-south-1": "8", + "ap-northeast-1": "8", + "ap-northeast-2": "8", + "ap-northeast-3": "8", + "ap-southeast-1": "8", + "ap-southeast-2": "8", + "ap-southeast-3": "8", + "eu-south-1": "8", + "eu-south-2": "8", + "af-south-1": "8", + "me-south-1": "8", + "me-central-1": "8" + }, + "arm-php-85": { + "ca-central-1": "5", + "eu-central-1": "5", + "eu-north-1": "5", + "eu-west-1": "5", + "eu-west-2": "5", + "eu-west-3": "5", + "sa-east-1": "5", + "us-east-1": "5", + "us-east-2": "5", + "us-west-1": "5", + "us-west-2": "5", + "ap-east-1": "5", + "ap-south-1": "5", + "ap-northeast-1": "5", + "ap-northeast-2": "5", + "ap-northeast-3": "5", + "ap-southeast-1": "5", + "ap-southeast-2": "5", + "ap-southeast-3": "5", + "eu-south-1": "5", + "eu-south-2": "5", + "af-south-1": "5", + "me-south-1": "5", + "me-central-1": "5" }, "arm-php-84": { - "ca-central-1": "7", - "eu-central-1": "7", - "eu-north-1": "7", - "eu-west-1": "7", - "eu-west-2": "7", - "eu-west-3": "7", - "sa-east-1": "7", - "us-east-1": "7", - "us-east-2": "7", - "us-west-1": "7", - "us-west-2": "7", - "ap-east-1": "7", - "ap-south-1": "7", - "ap-northeast-1": "7", - "ap-northeast-2": "7", - "ap-northeast-3": "7", - "ap-southeast-1": "7", - "ap-southeast-2": "7", - "ap-southeast-3": "7", - "eu-south-1": "7", - "eu-south-2": "7", - "af-south-1": "7", - "me-south-1": "7", - "me-central-1": "7" + "ca-central-1": "8", + "eu-central-1": "8", + "eu-north-1": "8", + "eu-west-1": "8", + "eu-west-2": "8", + "eu-west-3": "8", + "sa-east-1": "8", + "us-east-1": "8", + "us-east-2": "8", + "us-west-1": "8", + "us-west-2": "8", + "ap-east-1": "8", + "ap-south-1": "8", + "ap-northeast-1": "8", + "ap-northeast-2": "8", + "ap-northeast-3": "8", + "ap-southeast-1": "8", + "ap-southeast-2": "8", + "ap-southeast-3": "8", + "eu-south-1": "8", + "eu-south-2": "8", + "af-south-1": "8", + "me-south-1": "8", + "me-central-1": "8" }, "arm-php-83": { - "ca-central-1": "7", - "eu-central-1": "7", - "eu-north-1": "7", - "eu-west-1": "7", - "eu-west-2": "7", - "eu-west-3": "7", - "sa-east-1": "7", - "us-east-1": "7", - "us-east-2": "7", - "us-west-1": "7", - "us-west-2": "7", - "ap-east-1": "7", - "ap-south-1": "7", - "ap-northeast-1": "7", - "ap-northeast-2": "7", - "ap-northeast-3": "7", - "ap-southeast-1": "7", - "ap-southeast-2": "7", - "ap-southeast-3": "7", - "eu-south-1": "7", - "eu-south-2": "7", - "af-south-1": "7", - "me-south-1": "7", - "me-central-1": "7" + "ca-central-1": "8", + "eu-central-1": "8", + "eu-north-1": "8", + "eu-west-1": "8", + "eu-west-2": "8", + "eu-west-3": "8", + "sa-east-1": "8", + "us-east-1": "8", + "us-east-2": "8", + "us-west-1": "8", + "us-west-2": "8", + "ap-east-1": "8", + "ap-south-1": "8", + "ap-northeast-1": "8", + "ap-northeast-2": "8", + "ap-northeast-3": "8", + "ap-southeast-1": "8", + "ap-southeast-2": "8", + "ap-southeast-3": "8", + "eu-south-1": "8", + "eu-south-2": "8", + "af-south-1": "8", + "me-south-1": "8", + "me-central-1": "8" }, "arm-php-82": { - "ca-central-1": "7", - "eu-central-1": "7", - "eu-north-1": "7", - "eu-west-1": "7", - "eu-west-2": "7", - "eu-west-3": "7", - "sa-east-1": "7", - "us-east-1": "7", - "us-east-2": "7", - "us-west-1": "7", - "us-west-2": "7", - "ap-east-1": "7", - "ap-south-1": "7", - "ap-northeast-1": "7", - "ap-northeast-2": "7", - "ap-northeast-3": "7", - "ap-southeast-1": "7", - "ap-southeast-2": "7", - "ap-southeast-3": "7", - "eu-south-1": "7", - "eu-south-2": "7", - "af-south-1": "7", - "me-south-1": "7", - "me-central-1": "7" + "ca-central-1": "8", + "eu-central-1": "8", + "eu-north-1": "8", + "eu-west-1": "8", + "eu-west-2": "8", + "eu-west-3": "8", + "sa-east-1": "8", + "us-east-1": "8", + "us-east-2": "8", + "us-west-1": "8", + "us-west-2": "8", + "ap-east-1": "8", + "ap-south-1": "8", + "ap-northeast-1": "8", + "ap-northeast-2": "8", + "ap-northeast-3": "8", + "ap-southeast-1": "8", + "ap-southeast-2": "8", + "ap-southeast-3": "8", + "eu-south-1": "8", + "eu-south-2": "8", + "af-south-1": "8", + "me-south-1": "8", + "me-central-1": "8" } } \ No newline at end of file From 2a043aef6b889ca9a933e1bfefa69fca0394f01a Mon Sep 17 00:00:00 2001 From: mnapoli <720328+mnapoli@users.noreply.github.com> Date: Sun, 5 Oct 2025 13:59:51 +0000 Subject: [PATCH 27/53] Update layer versions --- layers.json | 384 ++++++++++++++++++++++++++-------------------------- 1 file changed, 192 insertions(+), 192 deletions(-) diff --git a/layers.json b/layers.json index 8d7866687..468fca8e5 100644 --- a/layers.json +++ b/layers.json @@ -1,210 +1,210 @@ { "php-85": { - "ca-central-1": "5", - "eu-central-1": "5", - "eu-north-1": "5", - "eu-west-1": "5", - "eu-west-2": "5", - "eu-west-3": "5", - "sa-east-1": "5", - "us-east-1": "5", - "us-east-2": "5", - "us-west-1": "5", - "us-west-2": "5", - "ap-east-1": "5", - "ap-south-1": "5", - "ap-northeast-1": "5", - "ap-northeast-2": "5", - "ap-northeast-3": "5", - "ap-southeast-1": "5", - "ap-southeast-2": "5", - "ap-southeast-3": "5", - "eu-south-1": "5", - "eu-south-2": "5", - "af-south-1": "5", - "me-south-1": "5", - "me-central-1": "5" + "ca-central-1": "6", + "eu-central-1": "6", + "eu-north-1": "6", + "eu-west-1": "6", + "eu-west-2": "6", + "eu-west-3": "6", + "sa-east-1": "6", + "us-east-1": "6", + "us-east-2": "6", + "us-west-1": "6", + "us-west-2": "6", + "ap-east-1": "6", + "ap-south-1": "6", + "ap-northeast-1": "6", + "ap-northeast-2": "6", + "ap-northeast-3": "6", + "ap-southeast-1": "6", + "ap-southeast-2": "6", + "ap-southeast-3": "6", + "eu-south-1": "6", + "eu-south-2": "6", + "af-south-1": "6", + "me-south-1": "6", + "me-central-1": "6" }, "php-84": { - "ca-central-1": "8", - "eu-central-1": "8", - "eu-north-1": "8", - "eu-west-1": "8", - "eu-west-2": "8", - "eu-west-3": "8", - "sa-east-1": "8", - "us-east-1": "8", - "us-east-2": "8", - "us-west-1": "8", - "us-west-2": "8", - "ap-east-1": "8", - "ap-south-1": "8", - "ap-northeast-1": "8", - "ap-northeast-2": "8", - "ap-northeast-3": "8", - "ap-southeast-1": "8", - "ap-southeast-2": "8", - "ap-southeast-3": "8", - "eu-south-1": "8", - "eu-south-2": "8", - "af-south-1": "8", - "me-south-1": "8", - "me-central-1": "8" + "ca-central-1": "9", + "eu-central-1": "9", + "eu-north-1": "9", + "eu-west-1": "9", + "eu-west-2": "9", + "eu-west-3": "9", + "sa-east-1": "9", + "us-east-1": "9", + "us-east-2": "9", + "us-west-1": "9", + "us-west-2": "9", + "ap-east-1": "9", + "ap-south-1": "9", + "ap-northeast-1": "9", + "ap-northeast-2": "9", + "ap-northeast-3": "9", + "ap-southeast-1": "9", + "ap-southeast-2": "9", + "ap-southeast-3": "9", + "eu-south-1": "9", + "eu-south-2": "9", + "af-south-1": "9", + "me-south-1": "9", + "me-central-1": "9" }, "php-83": { - "ca-central-1": "8", - "eu-central-1": "8", - "eu-north-1": "8", - "eu-west-1": "8", - "eu-west-2": "8", - "eu-west-3": "8", - "sa-east-1": "8", - "us-east-1": "8", - "us-east-2": "8", - "us-west-1": "8", - "us-west-2": "8", - "ap-east-1": "8", - "ap-south-1": "8", - "ap-northeast-1": "8", - "ap-northeast-2": "8", - "ap-northeast-3": "8", - "ap-southeast-1": "8", - "ap-southeast-2": "8", - "ap-southeast-3": "8", - "eu-south-1": "8", - "eu-south-2": "8", - "af-south-1": "8", - "me-south-1": "8", - "me-central-1": "8" + "ca-central-1": "9", + "eu-central-1": "9", + "eu-north-1": "9", + "eu-west-1": "9", + "eu-west-2": "9", + "eu-west-3": "9", + "sa-east-1": "9", + "us-east-1": "9", + "us-east-2": "9", + "us-west-1": "9", + "us-west-2": "9", + "ap-east-1": "9", + "ap-south-1": "9", + "ap-northeast-1": "9", + "ap-northeast-2": "9", + "ap-northeast-3": "9", + "ap-southeast-1": "9", + "ap-southeast-2": "9", + "ap-southeast-3": "9", + "eu-south-1": "9", + "eu-south-2": "9", + "af-south-1": "9", + "me-south-1": "9", + "me-central-1": "9" }, "php-82": { - "ca-central-1": "8", - "eu-central-1": "8", - "eu-north-1": "8", - "eu-west-1": "8", - "eu-west-2": "8", - "eu-west-3": "8", - "sa-east-1": "8", - "us-east-1": "8", - "us-east-2": "8", - "us-west-1": "8", - "us-west-2": "8", - "ap-east-1": "8", - "ap-south-1": "8", - "ap-northeast-1": "8", - "ap-northeast-2": "8", - "ap-northeast-3": "8", - "ap-southeast-1": "8", - "ap-southeast-2": "8", - "ap-southeast-3": "8", - "eu-south-1": "8", - "eu-south-2": "8", - "af-south-1": "8", - "me-south-1": "8", - "me-central-1": "8" + "ca-central-1": "9", + "eu-central-1": "9", + "eu-north-1": "9", + "eu-west-1": "9", + "eu-west-2": "9", + "eu-west-3": "9", + "sa-east-1": "9", + "us-east-1": "9", + "us-east-2": "9", + "us-west-1": "9", + "us-west-2": "9", + "ap-east-1": "9", + "ap-south-1": "9", + "ap-northeast-1": "9", + "ap-northeast-2": "9", + "ap-northeast-3": "9", + "ap-southeast-1": "9", + "ap-southeast-2": "9", + "ap-southeast-3": "9", + "eu-south-1": "9", + "eu-south-2": "9", + "af-south-1": "9", + "me-south-1": "9", + "me-central-1": "9" }, "arm-php-85": { - "ca-central-1": "5", - "eu-central-1": "5", - "eu-north-1": "5", - "eu-west-1": "5", - "eu-west-2": "5", - "eu-west-3": "5", - "sa-east-1": "5", - "us-east-1": "5", - "us-east-2": "5", - "us-west-1": "5", - "us-west-2": "5", - "ap-east-1": "5", - "ap-south-1": "5", - "ap-northeast-1": "5", - "ap-northeast-2": "5", - "ap-northeast-3": "5", - "ap-southeast-1": "5", - "ap-southeast-2": "5", - "ap-southeast-3": "5", - "eu-south-1": "5", - "eu-south-2": "5", - "af-south-1": "5", - "me-south-1": "5", - "me-central-1": "5" + "ca-central-1": "6", + "eu-central-1": "6", + "eu-north-1": "6", + "eu-west-1": "6", + "eu-west-2": "6", + "eu-west-3": "6", + "sa-east-1": "6", + "us-east-1": "6", + "us-east-2": "6", + "us-west-1": "6", + "us-west-2": "6", + "ap-east-1": "6", + "ap-south-1": "6", + "ap-northeast-1": "6", + "ap-northeast-2": "6", + "ap-northeast-3": "6", + "ap-southeast-1": "6", + "ap-southeast-2": "6", + "ap-southeast-3": "6", + "eu-south-1": "6", + "eu-south-2": "6", + "af-south-1": "6", + "me-south-1": "6", + "me-central-1": "6" }, "arm-php-84": { - "ca-central-1": "8", - "eu-central-1": "8", - "eu-north-1": "8", - "eu-west-1": "8", - "eu-west-2": "8", - "eu-west-3": "8", - "sa-east-1": "8", - "us-east-1": "8", - "us-east-2": "8", - "us-west-1": "8", - "us-west-2": "8", - "ap-east-1": "8", - "ap-south-1": "8", - "ap-northeast-1": "8", - "ap-northeast-2": "8", - "ap-northeast-3": "8", - "ap-southeast-1": "8", - "ap-southeast-2": "8", - "ap-southeast-3": "8", - "eu-south-1": "8", - "eu-south-2": "8", - "af-south-1": "8", - "me-south-1": "8", - "me-central-1": "8" + "ca-central-1": "9", + "eu-central-1": "9", + "eu-north-1": "9", + "eu-west-1": "9", + "eu-west-2": "9", + "eu-west-3": "9", + "sa-east-1": "9", + "us-east-1": "9", + "us-east-2": "9", + "us-west-1": "9", + "us-west-2": "9", + "ap-east-1": "9", + "ap-south-1": "9", + "ap-northeast-1": "9", + "ap-northeast-2": "9", + "ap-northeast-3": "9", + "ap-southeast-1": "9", + "ap-southeast-2": "9", + "ap-southeast-3": "9", + "eu-south-1": "9", + "eu-south-2": "9", + "af-south-1": "9", + "me-south-1": "9", + "me-central-1": "9" }, "arm-php-83": { - "ca-central-1": "8", - "eu-central-1": "8", - "eu-north-1": "8", - "eu-west-1": "8", - "eu-west-2": "8", - "eu-west-3": "8", - "sa-east-1": "8", - "us-east-1": "8", - "us-east-2": "8", - "us-west-1": "8", - "us-west-2": "8", - "ap-east-1": "8", - "ap-south-1": "8", - "ap-northeast-1": "8", - "ap-northeast-2": "8", - "ap-northeast-3": "8", - "ap-southeast-1": "8", - "ap-southeast-2": "8", - "ap-southeast-3": "8", - "eu-south-1": "8", - "eu-south-2": "8", - "af-south-1": "8", - "me-south-1": "8", - "me-central-1": "8" + "ca-central-1": "9", + "eu-central-1": "9", + "eu-north-1": "9", + "eu-west-1": "9", + "eu-west-2": "9", + "eu-west-3": "9", + "sa-east-1": "9", + "us-east-1": "9", + "us-east-2": "9", + "us-west-1": "9", + "us-west-2": "9", + "ap-east-1": "9", + "ap-south-1": "9", + "ap-northeast-1": "9", + "ap-northeast-2": "9", + "ap-northeast-3": "9", + "ap-southeast-1": "9", + "ap-southeast-2": "9", + "ap-southeast-3": "9", + "eu-south-1": "9", + "eu-south-2": "9", + "af-south-1": "9", + "me-south-1": "9", + "me-central-1": "9" }, "arm-php-82": { - "ca-central-1": "8", - "eu-central-1": "8", - "eu-north-1": "8", - "eu-west-1": "8", - "eu-west-2": "8", - "eu-west-3": "8", - "sa-east-1": "8", - "us-east-1": "8", - "us-east-2": "8", - "us-west-1": "8", - "us-west-2": "8", - "ap-east-1": "8", - "ap-south-1": "8", - "ap-northeast-1": "8", - "ap-northeast-2": "8", - "ap-northeast-3": "8", - "ap-southeast-1": "8", - "ap-southeast-2": "8", - "ap-southeast-3": "8", - "eu-south-1": "8", - "eu-south-2": "8", - "af-south-1": "8", - "me-south-1": "8", - "me-central-1": "8" + "ca-central-1": "9", + "eu-central-1": "9", + "eu-north-1": "9", + "eu-west-1": "9", + "eu-west-2": "9", + "eu-west-3": "9", + "sa-east-1": "9", + "us-east-1": "9", + "us-east-2": "9", + "us-west-1": "9", + "us-west-2": "9", + "ap-east-1": "9", + "ap-south-1": "9", + "ap-northeast-1": "9", + "ap-northeast-2": "9", + "ap-northeast-3": "9", + "ap-southeast-1": "9", + "ap-southeast-2": "9", + "ap-southeast-3": "9", + "eu-south-1": "9", + "eu-south-2": "9", + "af-south-1": "9", + "me-south-1": "9", + "me-central-1": "9" } } \ No newline at end of file From 128d1924ea4d8eed6d495a59458c66088bdc55a4 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Fri, 24 Oct 2025 08:15:27 +0200 Subject: [PATCH 28/53] Update all documentation to point to provided.al2023 instead of provided.al2 --- docs/runtimes.mdx | 6 +++--- docs/runtimes/runtimes-details.mdx | 4 ++-- tests/FpmRuntime/Functional/serverless.yml | 2 +- tests/Sam/template.yaml | 8 ++++---- 4 files changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/runtimes.mdx b/docs/runtimes.mdx index 49a0a85a6..59fdae1c8 100644 --- a/docs/runtimes.mdx +++ b/docs/runtimes.mdx @@ -146,12 +146,12 @@ into this: functions: hello: # ... - runtime: provided.al2 + runtime: provided.al2023 layers: - 'arn:aws:lambda:us-east-1:873528684822:layer:php-84:21' ``` -☝️ `provided.al2` [is the generic Linux environment for custom runtimes](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html#runtimes-custom-use), and the `layers` config points to Bref's AWS Lambda layers. +☝️ `provided.al2023` [is the generic Linux environment for custom runtimes](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html#runtimes-custom-use), and the `layers` config points to Bref's AWS Lambda layers. Thanks to the Bref plugin, our `serverless.yml` is simpler. It also automatically adapts to the AWS region in use, and automatically points to the correct layer version. You can learn more about "layers" [in this page](./runtimes/runtimes-details.mdx). @@ -161,7 +161,7 @@ If you want to reference AWS Lambda layers directly (instead of using the simple service: app provider: name: aws - runtime: provided.al2 + runtime: provided.al2023 plugins: - ./vendor/bref/bref functions: diff --git a/docs/runtimes/runtimes-details.mdx b/docs/runtimes/runtimes-details.mdx index 5230fb3dd..3ecdecf57 100644 --- a/docs/runtimes/runtimes-details.mdx +++ b/docs/runtimes/runtimes-details.mdx @@ -32,7 +32,7 @@ provider: functions: hello: # ... - runtime: provided.al2 + runtime: provided.al2023 layers: - 'arn:aws:lambda:us-east-1:873528684822:layer:php-84:21' ``` @@ -47,7 +47,7 @@ Resources: Type: AWS::Serverless::Function Properties: # ... - Runtime: provided.al2 + Runtime: provided.al2023 Layers: - 'arn:aws:lambda:us-east-1:873528684822:layer:php-84:21' ``` diff --git a/tests/FpmRuntime/Functional/serverless.yml b/tests/FpmRuntime/Functional/serverless.yml index 07c108f43..66bf3ea41 100644 --- a/tests/FpmRuntime/Functional/serverless.yml +++ b/tests/FpmRuntime/Functional/serverless.yml @@ -2,7 +2,7 @@ service: bref-tests provider: name: aws - runtime: provided.al2 + runtime: provided.al2023 region: eu-west-1 profile: bref-tests apiGateway: diff --git a/tests/Sam/template.yaml b/tests/Sam/template.yaml index c78dcd7c6..05ca94f6b 100644 --- a/tests/Sam/template.yaml +++ b/tests/Sam/template.yaml @@ -8,7 +8,7 @@ Resources: FunctionName: 'bref-tests-function' CodeUri: ../.. Handler: tests/Sam/Php/function.php - Runtime: provided.al2 + Runtime: provided.al2023 Layers: - 'arn:aws:lambda:us-east-1:873528684822:layer:php-74:18' Environment: @@ -21,7 +21,7 @@ Resources: FunctionName: 'bref-tests-http' CodeUri: ../.. Handler: tests/Sam/PhpFpm/index.php - Runtime: provided.al2 + Runtime: provided.al2023 Layers: - 'arn:aws:lambda:us-east-1:873528684822:layer:php-74-fpm:18' Events: @@ -40,7 +40,7 @@ Resources: FunctionName: 'bref-tests-http-missing-handler' CodeUri: ../.. Handler: tests/Sam/PhpFpm/UNKNOWN.php - Runtime: provided.al2 + Runtime: provided.al2023 Layers: - 'arn:aws:lambda:us-east-1:873528684822:layer:php-74-fpm:18' Events: @@ -56,7 +56,7 @@ Resources: FunctionName: 'bref-tests-psr7' CodeUri: ../.. Handler: tests/Sam/Php/psr7.php - Runtime: provided.al2 + Runtime: provided.al2023 Layers: - 'arn:aws:lambda:us-east-1:873528684822:layer:php-74:18' Events: From d8b05468766595e732d5b5cc79ae1a1bb8340e9b Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Fri, 24 Oct 2025 10:36:47 +0200 Subject: [PATCH 29/53] Remove the deprecated "hooks" system This was replaced by EventSubscriber --- src/Bref.php | 49 ----------------------------------- src/ConsoleRuntime/Main.php | 1 - src/FpmRuntime/Main.php | 1 - src/FunctionRuntime/Main.php | 1 - src/Runtime/LambdaRuntime.php | 1 - tests/BrefTest.php | 30 --------------------- 6 files changed, 83 deletions(-) diff --git a/src/Bref.php b/src/Bref.php index d5d6c5fe7..38b705c52 100644 --- a/src/Bref.php +++ b/src/Bref.php @@ -12,11 +12,6 @@ class Bref { private static ?Closure $containerProvider = null; private static ?ContainerInterface $container = null; - /** @deprecated Use Bref::events()->subscribe() instead */ - private static array $hooks = [ - 'beforeStartup' => [], - 'beforeInvoke' => [], - ]; private static EventDispatcher $eventDispatcher; /** @@ -37,46 +32,6 @@ public static function events(): EventDispatcher return self::$eventDispatcher; } - /** - * Register a hook to be executed before the runtime starts. - * - * Warning: hooks are low-level extension points to be used by framework - * integrations. For user code, it is not recommended to use them. Use your - * framework's extension points instead. - * - * @deprecated Use Bref::events()->subscribe() instead. - */ - public static function beforeStartup(Closure $hook): void - { - self::$hooks['beforeStartup'][] = $hook; - } - - /** - * Register a hook to be executed before any Lambda invocation. - * - * Warning: hooks are low-level extension points to be used by framework - * integrations. For user code, it is not recommended to use them. Use your - * framework's extension points instead. - * - * @deprecated Use Bref::events()->subscribe() instead. - */ - public static function beforeInvoke(Closure $hook): void - { - self::$hooks['beforeInvoke'][] = $hook; - } - - /** - * @param 'beforeStartup'|'beforeInvoke' $hookName - * - * @internal Used by the Bref runtime - */ - public static function triggerHooks(string $hookName): void - { - foreach (self::$hooks[$hookName] as $hook) { - $hook(); - } - } - /** * @internal Used by the Bref runtime */ @@ -103,10 +58,6 @@ public static function reset(): void { self::$containerProvider = null; self::$container = null; - self::$hooks = [ - 'beforeStartup' => [], - 'beforeInvoke' => [], - ]; self::$eventDispatcher = new EventDispatcher; } } diff --git a/src/ConsoleRuntime/Main.php b/src/ConsoleRuntime/Main.php index 5e51639e3..9e9a31c1f 100755 --- a/src/ConsoleRuntime/Main.php +++ b/src/ConsoleRuntime/Main.php @@ -20,7 +20,6 @@ public static function run(): void LazySecretsLoader::loadSecretEnvironmentVariables(); - Bref::triggerHooks('beforeStartup'); Bref::events()->beforeStartup(); $lambdaRuntime = LambdaRuntime::fromEnvironmentVariable('console'); diff --git a/src/FpmRuntime/Main.php b/src/FpmRuntime/Main.php index adf570311..8ec401ea3 100755 --- a/src/FpmRuntime/Main.php +++ b/src/FpmRuntime/Main.php @@ -20,7 +20,6 @@ public static function run(): void LazySecretsLoader::loadSecretEnvironmentVariables(); - Bref::triggerHooks('beforeStartup'); Bref::events()->beforeStartup(); $lambdaRuntime = LambdaRuntime::fromEnvironmentVariable('fpm'); diff --git a/src/FunctionRuntime/Main.php b/src/FunctionRuntime/Main.php index 7a4dda0de..823293f03 100644 --- a/src/FunctionRuntime/Main.php +++ b/src/FunctionRuntime/Main.php @@ -19,7 +19,6 @@ public static function run(): void LazySecretsLoader::loadSecretEnvironmentVariables(); - Bref::triggerHooks('beforeStartup'); Bref::events()->beforeStartup(); $lambdaRuntime = LambdaRuntime::fromEnvironmentVariable('function'); diff --git a/src/Runtime/LambdaRuntime.php b/src/Runtime/LambdaRuntime.php index 17fa52e65..171dc0b03 100755 --- a/src/Runtime/LambdaRuntime.php +++ b/src/Runtime/LambdaRuntime.php @@ -88,7 +88,6 @@ public function processNextEvent(Handler | RequestHandlerInterface | callable $h try { ColdStartTracker::invocationStarted(); - Bref::triggerHooks('beforeInvoke'); Bref::events()->beforeInvoke($handler, $event, $context); $this->ping(); diff --git a/tests/BrefTest.php b/tests/BrefTest.php index 4ebbd05cd..8be54f30a 100644 --- a/tests/BrefTest.php +++ b/tests/BrefTest.php @@ -30,34 +30,4 @@ public function test override the container(): void $this->assertSame($container, Bref::getContainer()); } - - public function test hooks(): void - { - $beforeStartup1 = false; - $beforeStartup2 = false; - $beforeInvoke = false; - - // Check that we can set multiple handlers - Bref::beforeStartup(function () use (&$beforeStartup1) { - return $beforeStartup1 = true; - }); - Bref::beforeStartup(function () use (&$beforeStartup2) { - return $beforeStartup2 = true; - }); - Bref::beforeInvoke(function () use (&$beforeInvoke) { - return $beforeInvoke = true; - }); - - $this->assertFalse($beforeStartup1); - $this->assertFalse($beforeStartup2); - $this->assertFalse($beforeInvoke); - - Bref::triggerHooks('beforeStartup'); - $this->assertTrue($beforeStartup1); - $this->assertTrue($beforeStartup2); - $this->assertFalse($beforeInvoke); - - Bref::triggerHooks('beforeInvoke'); - $this->assertTrue($beforeInvoke); - } } From 50d187c8088d7dcf85f0a2b2176f67bbbdc6748a Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Fri, 24 Oct 2025 10:40:35 +0200 Subject: [PATCH 30/53] Fix --- tests/ConsoleRuntime/MainTest.php | 10 ---------- tests/FpmRuntime/MainTest.php | 21 --------------------- tests/FunctionRuntime/MainTest.php | 21 --------------------- 3 files changed, 52 deletions(-) delete mode 100644 tests/FpmRuntime/MainTest.php delete mode 100644 tests/FunctionRuntime/MainTest.php diff --git a/tests/ConsoleRuntime/MainTest.php b/tests/ConsoleRuntime/MainTest.php index 37785ae50..1a32665ce 100644 --- a/tests/ConsoleRuntime/MainTest.php +++ b/tests/ConsoleRuntime/MainTest.php @@ -19,16 +19,6 @@ public function setUp(): void putenv('_HANDLER=console.php'); } - public function test startup hook is called() - { - Bref::beforeStartup(function () { - throw new Exception('This should be called'); - }); - - $this->expectExceptionMessage('This should be called'); - Main::run(); - } - public function test happy path() { $this->givenAnEvent(''); diff --git a/tests/FpmRuntime/MainTest.php b/tests/FpmRuntime/MainTest.php deleted file mode 100644 index 7c0aa5c16..000000000 --- a/tests/FpmRuntime/MainTest.php +++ /dev/null @@ -1,21 +0,0 @@ -expectExceptionMessage('This should be called'); - Main::run(); - } -} diff --git a/tests/FunctionRuntime/MainTest.php b/tests/FunctionRuntime/MainTest.php deleted file mode 100644 index 97fe60eaf..000000000 --- a/tests/FunctionRuntime/MainTest.php +++ /dev/null @@ -1,21 +0,0 @@ -expectExceptionMessage('This should be called'); - Main::run(); - } -} From 9fe6e066373b272389cca196e9f0118a36cfc599 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Fri, 24 Oct 2025 11:22:58 +0200 Subject: [PATCH 31/53] Fix --- tests/ConsoleRuntime/MainTest.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/tests/ConsoleRuntime/MainTest.php b/tests/ConsoleRuntime/MainTest.php index 1a32665ce..0b3f1946a 100644 --- a/tests/ConsoleRuntime/MainTest.php +++ b/tests/ConsoleRuntime/MainTest.php @@ -2,12 +2,10 @@ namespace Bref\Test\ConsoleRuntime; -use Bref\Bref; use Bref\ConsoleRuntime\CommandFailed; use Bref\ConsoleRuntime\Main; use Bref\Test\RuntimeTestCase; use Bref\Test\Server; -use Exception; class MainTest extends RuntimeTestCase { From 9dbd028fc628cdac703a106436201ba1ca1f7854 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Sun, 26 Oct 2025 20:15:08 +0100 Subject: [PATCH 32/53] Fix PHP 8.5 deprecations --- src/Runtime/LambdaRuntime.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/Runtime/LambdaRuntime.php b/src/Runtime/LambdaRuntime.php index 171dc0b03..e08219809 100755 --- a/src/Runtime/LambdaRuntime.php +++ b/src/Runtime/LambdaRuntime.php @@ -336,7 +336,6 @@ private function postJson(string $url, mixed $data, array $headers = []): void private function closeCurlHandleNext(): void { if ($this->curlHandleNext !== null) { - curl_close($this->curlHandleNext); $this->curlHandleNext = null; } } @@ -344,7 +343,6 @@ private function closeCurlHandleNext(): void private function closeCurlHandleResult(): void { if ($this->curlHandleResult !== null) { - curl_close($this->curlHandleResult); $this->curlHandleResult = null; } } From 91812ba34e07072a052432acffb7dfcf10ba1f08 Mon Sep 17 00:00:00 2001 From: mnapoli <720328+mnapoli@users.noreply.github.com> Date: Mon, 27 Oct 2025 17:45:39 +0000 Subject: [PATCH 33/53] Update layer versions --- layers.json | 384 ++++++++++++++++++++++++++-------------------------- 1 file changed, 192 insertions(+), 192 deletions(-) diff --git a/layers.json b/layers.json index 468fca8e5..015ca0fe9 100644 --- a/layers.json +++ b/layers.json @@ -1,210 +1,210 @@ { "php-85": { - "ca-central-1": "6", - "eu-central-1": "6", - "eu-north-1": "6", - "eu-west-1": "6", - "eu-west-2": "6", - "eu-west-3": "6", - "sa-east-1": "6", - "us-east-1": "6", - "us-east-2": "6", - "us-west-1": "6", - "us-west-2": "6", - "ap-east-1": "6", - "ap-south-1": "6", - "ap-northeast-1": "6", - "ap-northeast-2": "6", - "ap-northeast-3": "6", - "ap-southeast-1": "6", - "ap-southeast-2": "6", - "ap-southeast-3": "6", - "eu-south-1": "6", - "eu-south-2": "6", - "af-south-1": "6", - "me-south-1": "6", - "me-central-1": "6" + "ca-central-1": "7", + "eu-central-1": "7", + "eu-north-1": "7", + "eu-west-1": "7", + "eu-west-2": "7", + "eu-west-3": "7", + "sa-east-1": "7", + "us-east-1": "7", + "us-east-2": "7", + "us-west-1": "7", + "us-west-2": "7", + "ap-east-1": "7", + "ap-south-1": "7", + "ap-northeast-1": "7", + "ap-northeast-2": "7", + "ap-northeast-3": "7", + "ap-southeast-1": "7", + "ap-southeast-2": "7", + "ap-southeast-3": "7", + "eu-south-1": "7", + "eu-south-2": "7", + "af-south-1": "7", + "me-south-1": "7", + "me-central-1": "7" }, "php-84": { - "ca-central-1": "9", - "eu-central-1": "9", - "eu-north-1": "9", - "eu-west-1": "9", - "eu-west-2": "9", - "eu-west-3": "9", - "sa-east-1": "9", - "us-east-1": "9", - "us-east-2": "9", - "us-west-1": "9", - "us-west-2": "9", - "ap-east-1": "9", - "ap-south-1": "9", - "ap-northeast-1": "9", - "ap-northeast-2": "9", - "ap-northeast-3": "9", - "ap-southeast-1": "9", - "ap-southeast-2": "9", - "ap-southeast-3": "9", - "eu-south-1": "9", - "eu-south-2": "9", - "af-south-1": "9", - "me-south-1": "9", - "me-central-1": "9" + "ca-central-1": "10", + "eu-central-1": "10", + "eu-north-1": "10", + "eu-west-1": "10", + "eu-west-2": "10", + "eu-west-3": "10", + "sa-east-1": "10", + "us-east-1": "10", + "us-east-2": "10", + "us-west-1": "10", + "us-west-2": "10", + "ap-east-1": "10", + "ap-south-1": "10", + "ap-northeast-1": "10", + "ap-northeast-2": "10", + "ap-northeast-3": "10", + "ap-southeast-1": "10", + "ap-southeast-2": "10", + "ap-southeast-3": "10", + "eu-south-1": "10", + "eu-south-2": "10", + "af-south-1": "10", + "me-south-1": "10", + "me-central-1": "10" }, "php-83": { - "ca-central-1": "9", - "eu-central-1": "9", - "eu-north-1": "9", - "eu-west-1": "9", - "eu-west-2": "9", - "eu-west-3": "9", - "sa-east-1": "9", - "us-east-1": "9", - "us-east-2": "9", - "us-west-1": "9", - "us-west-2": "9", - "ap-east-1": "9", - "ap-south-1": "9", - "ap-northeast-1": "9", - "ap-northeast-2": "9", - "ap-northeast-3": "9", - "ap-southeast-1": "9", - "ap-southeast-2": "9", - "ap-southeast-3": "9", - "eu-south-1": "9", - "eu-south-2": "9", - "af-south-1": "9", - "me-south-1": "9", - "me-central-1": "9" + "ca-central-1": "10", + "eu-central-1": "10", + "eu-north-1": "10", + "eu-west-1": "10", + "eu-west-2": "10", + "eu-west-3": "10", + "sa-east-1": "10", + "us-east-1": "10", + "us-east-2": "10", + "us-west-1": "10", + "us-west-2": "10", + "ap-east-1": "10", + "ap-south-1": "10", + "ap-northeast-1": "10", + "ap-northeast-2": "10", + "ap-northeast-3": "10", + "ap-southeast-1": "10", + "ap-southeast-2": "10", + "ap-southeast-3": "10", + "eu-south-1": "10", + "eu-south-2": "10", + "af-south-1": "10", + "me-south-1": "10", + "me-central-1": "10" }, "php-82": { - "ca-central-1": "9", - "eu-central-1": "9", - "eu-north-1": "9", - "eu-west-1": "9", - "eu-west-2": "9", - "eu-west-3": "9", - "sa-east-1": "9", - "us-east-1": "9", - "us-east-2": "9", - "us-west-1": "9", - "us-west-2": "9", - "ap-east-1": "9", - "ap-south-1": "9", - "ap-northeast-1": "9", - "ap-northeast-2": "9", - "ap-northeast-3": "9", - "ap-southeast-1": "9", - "ap-southeast-2": "9", - "ap-southeast-3": "9", - "eu-south-1": "9", - "eu-south-2": "9", - "af-south-1": "9", - "me-south-1": "9", - "me-central-1": "9" + "ca-central-1": "10", + "eu-central-1": "10", + "eu-north-1": "10", + "eu-west-1": "10", + "eu-west-2": "10", + "eu-west-3": "10", + "sa-east-1": "10", + "us-east-1": "10", + "us-east-2": "10", + "us-west-1": "10", + "us-west-2": "10", + "ap-east-1": "10", + "ap-south-1": "10", + "ap-northeast-1": "10", + "ap-northeast-2": "10", + "ap-northeast-3": "10", + "ap-southeast-1": "10", + "ap-southeast-2": "10", + "ap-southeast-3": "10", + "eu-south-1": "10", + "eu-south-2": "10", + "af-south-1": "10", + "me-south-1": "10", + "me-central-1": "10" }, "arm-php-85": { - "ca-central-1": "6", - "eu-central-1": "6", - "eu-north-1": "6", - "eu-west-1": "6", - "eu-west-2": "6", - "eu-west-3": "6", - "sa-east-1": "6", - "us-east-1": "6", - "us-east-2": "6", - "us-west-1": "6", - "us-west-2": "6", - "ap-east-1": "6", - "ap-south-1": "6", - "ap-northeast-1": "6", - "ap-northeast-2": "6", - "ap-northeast-3": "6", - "ap-southeast-1": "6", - "ap-southeast-2": "6", - "ap-southeast-3": "6", - "eu-south-1": "6", - "eu-south-2": "6", - "af-south-1": "6", - "me-south-1": "6", - "me-central-1": "6" + "ca-central-1": "7", + "eu-central-1": "7", + "eu-north-1": "7", + "eu-west-1": "7", + "eu-west-2": "7", + "eu-west-3": "7", + "sa-east-1": "7", + "us-east-1": "7", + "us-east-2": "7", + "us-west-1": "7", + "us-west-2": "7", + "ap-east-1": "7", + "ap-south-1": "7", + "ap-northeast-1": "7", + "ap-northeast-2": "7", + "ap-northeast-3": "7", + "ap-southeast-1": "7", + "ap-southeast-2": "7", + "ap-southeast-3": "7", + "eu-south-1": "7", + "eu-south-2": "7", + "af-south-1": "7", + "me-south-1": "7", + "me-central-1": "7" }, "arm-php-84": { - "ca-central-1": "9", - "eu-central-1": "9", - "eu-north-1": "9", - "eu-west-1": "9", - "eu-west-2": "9", - "eu-west-3": "9", - "sa-east-1": "9", - "us-east-1": "9", - "us-east-2": "9", - "us-west-1": "9", - "us-west-2": "9", - "ap-east-1": "9", - "ap-south-1": "9", - "ap-northeast-1": "9", - "ap-northeast-2": "9", - "ap-northeast-3": "9", - "ap-southeast-1": "9", - "ap-southeast-2": "9", - "ap-southeast-3": "9", - "eu-south-1": "9", - "eu-south-2": "9", - "af-south-1": "9", - "me-south-1": "9", - "me-central-1": "9" + "ca-central-1": "10", + "eu-central-1": "10", + "eu-north-1": "10", + "eu-west-1": "10", + "eu-west-2": "10", + "eu-west-3": "10", + "sa-east-1": "10", + "us-east-1": "10", + "us-east-2": "10", + "us-west-1": "10", + "us-west-2": "10", + "ap-east-1": "10", + "ap-south-1": "10", + "ap-northeast-1": "10", + "ap-northeast-2": "10", + "ap-northeast-3": "10", + "ap-southeast-1": "10", + "ap-southeast-2": "10", + "ap-southeast-3": "10", + "eu-south-1": "10", + "eu-south-2": "10", + "af-south-1": "10", + "me-south-1": "10", + "me-central-1": "10" }, "arm-php-83": { - "ca-central-1": "9", - "eu-central-1": "9", - "eu-north-1": "9", - "eu-west-1": "9", - "eu-west-2": "9", - "eu-west-3": "9", - "sa-east-1": "9", - "us-east-1": "9", - "us-east-2": "9", - "us-west-1": "9", - "us-west-2": "9", - "ap-east-1": "9", - "ap-south-1": "9", - "ap-northeast-1": "9", - "ap-northeast-2": "9", - "ap-northeast-3": "9", - "ap-southeast-1": "9", - "ap-southeast-2": "9", - "ap-southeast-3": "9", - "eu-south-1": "9", - "eu-south-2": "9", - "af-south-1": "9", - "me-south-1": "9", - "me-central-1": "9" + "ca-central-1": "10", + "eu-central-1": "10", + "eu-north-1": "10", + "eu-west-1": "10", + "eu-west-2": "10", + "eu-west-3": "10", + "sa-east-1": "10", + "us-east-1": "10", + "us-east-2": "10", + "us-west-1": "10", + "us-west-2": "10", + "ap-east-1": "10", + "ap-south-1": "10", + "ap-northeast-1": "10", + "ap-northeast-2": "10", + "ap-northeast-3": "10", + "ap-southeast-1": "10", + "ap-southeast-2": "10", + "ap-southeast-3": "10", + "eu-south-1": "10", + "eu-south-2": "10", + "af-south-1": "10", + "me-south-1": "10", + "me-central-1": "10" }, "arm-php-82": { - "ca-central-1": "9", - "eu-central-1": "9", - "eu-north-1": "9", - "eu-west-1": "9", - "eu-west-2": "9", - "eu-west-3": "9", - "sa-east-1": "9", - "us-east-1": "9", - "us-east-2": "9", - "us-west-1": "9", - "us-west-2": "9", - "ap-east-1": "9", - "ap-south-1": "9", - "ap-northeast-1": "9", - "ap-northeast-2": "9", - "ap-northeast-3": "9", - "ap-southeast-1": "9", - "ap-southeast-2": "9", - "ap-southeast-3": "9", - "eu-south-1": "9", - "eu-south-2": "9", - "af-south-1": "9", - "me-south-1": "9", - "me-central-1": "9" + "ca-central-1": "10", + "eu-central-1": "10", + "eu-north-1": "10", + "eu-west-1": "10", + "eu-west-2": "10", + "eu-west-3": "10", + "sa-east-1": "10", + "us-east-1": "10", + "us-east-2": "10", + "us-west-1": "10", + "us-west-2": "10", + "ap-east-1": "10", + "ap-south-1": "10", + "ap-northeast-1": "10", + "ap-northeast-2": "10", + "ap-northeast-3": "10", + "ap-southeast-1": "10", + "ap-southeast-2": "10", + "ap-southeast-3": "10", + "eu-south-1": "10", + "eu-south-2": "10", + "af-south-1": "10", + "me-south-1": "10", + "me-central-1": "10" } } \ No newline at end of file From b3594c75a12309908a3c1c4035d81bcd222418b6 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Tue, 25 Nov 2025 15:43:58 +0000 Subject: [PATCH 34/53] Delete the `bref` CLI --- bref | 132 ------------------------------- composer.json | 1 - docs/default/getting-started.mdx | 43 ++++++---- docs/symfony/getting-started.mdx | 51 ++++++++++-- src/Cli/init.php | 100 ----------------------- template/function/index.php | 7 -- template/function/serverless.yml | 23 ------ template/http/index.php | 26 ------ template/http/serverless.yml | 27 ------- template/symfony/serverless.yml | 47 ----------- tests/CliTest.php | 16 ---- 11 files changed, 73 insertions(+), 400 deletions(-) delete mode 100755 bref delete mode 100644 src/Cli/init.php delete mode 100644 template/function/index.php delete mode 100644 template/function/serverless.yml delete mode 100644 template/http/index.php delete mode 100644 template/http/serverless.yml delete mode 100644 template/symfony/serverless.yml delete mode 100644 tests/CliTest.php diff --git a/bref b/bref deleted file mode 100755 index 75a438b55..000000000 --- a/bref +++ /dev/null @@ -1,132 +0,0 @@ -#!/usr/bin/env php - 'vendor/bin/bref', - 'v' => 2, // Bref version - 'c' => $argv[1] ?? '', - 'ci' => $ci, - // anonymous user ID created by the Serverless Framework - 'uid' => $userConfig['frameworkId'] ?? '', - ], JSON_THROW_ON_ERROR); - - $sock = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP); - // This IP address is the Bref server. - // If this server is down or unreachable, there should be no difference in overhead - // or execution time. - socket_sendto($sock, $message, strlen($message), 0, '108.128.197.71', 8888); - socket_close($sock); -} diff --git a/composer.json b/composer.json index f8d7d7cac..f16297025 100644 --- a/composer.json +++ b/composer.json @@ -16,7 +16,6 @@ } }, "bin": [ - "bref", "src/bref-local" ], "require": { diff --git a/docs/default/getting-started.mdx b/docs/default/getting-started.mdx index bf2cbd87e..796f1ea8e 100644 --- a/docs/default/getting-started.mdx +++ b/docs/default/getting-started.mdx @@ -27,33 +27,29 @@ Next, in an empty directory, install Bref using Composer: composer require bref/bref ``` -Make sure that the version of Bref that was installed is 1.0 or greater. +Make sure that the version of Bref that was installed is 3.0 or greater. -Then let's start by initializing a new project by running: +Then, create a `serverless.yml` file. This file will describe how to deploy your application. -```bash -vendor/bin/bref init -``` - -Accept all the defaults by pressing "Enter". The following files will be created in your project: - -- `index.php` contains the code of your application -- `serverless.yml` contains the configuration for deploying on AWS - -You are free to edit `index.php`. +```yml filename="serverless.yml" +service: app # your application name (lowercase without spaces) -To deploy an existing application, you can delete `index.php` and edit `serverless.yml` to point to your existing index file (for example it may be another file like `public/index.php`). You can also create the `serverless.yml` file manually: +bref: + # Uncomment and set your team ID if you are using Bref Cloud + #team: bref-team-id -```yml filename="serverless.yml" -service: app provider: name: aws - region: us-east-1 + region: us-east-1 # AWS region to deploy to + environment: # Environment variables + APP_ENV: prod functions: web: + # `index.php` is the entrypoint of your application handler: index.php runtime: php-84-fpm + timeout: 28 # in seconds (API Gateway has a max timeout of 29 seconds) events: - httpApi: '*' @@ -66,6 +62,21 @@ plugins: - ./vendor/bref/bref ``` +If your `index.php` entrypoint is in a different folder, feel free to adjust the `handler` key. For example if it is in `public/index.php`: + +```yml + handler: public/index.php +``` + +If this is a new application, you can create a very simple `index.php` file to test things out, for example: + +```php +find('serverless')) { - warning( - 'The `serverless` command is not installed.' . PHP_EOL . - 'You will not be able to deploy your application unless it is installed' . PHP_EOL . - 'Please follow the instructions at https://bref.sh/docs/installation.html' . PHP_EOL . - 'If you have the `serverless` command available elsewhere (eg in a Docker container) you can ignore this warning.' . PHP_EOL - ); - } - - if (! $template) { - $intro = green('What kind of application are you building?'); - echo << ') ?: '0'; - echo PHP_EOL; - if (! in_array($choice, ['0', '1', '2'], true)) { - error('Invalid response (must be "0", "1" or "2"), aborting'); - } - - $template = [ - '0' => 'http', - '1' => 'function', - '2' => 'symfony', - ][$choice]; - } - - $rootPath = dirname(__DIR__, 2) . "/template/$template"; - - if (file_exists($rootPath . '/index.php')) { - createFile($rootPath, 'index.php'); - } - createFile($rootPath, 'serverless.yml'); - - // If these is a `.gitignore` file in the current directory, let's add `.serverless` to it - if (file_exists('.gitignore')) { - $gitignore = file_get_contents('.gitignore'); - if (! str_contains($gitignore, '.serverless')) { - file_put_contents('.gitignore', PHP_EOL . '.serverless' . PHP_EOL, FILE_APPEND); - success('Added `.serverless` to your `.gitignore` file.'); - } - } - - success('Project initialized and ready to test or deploy.'); -} - -/** - * Creates files from the template directory and automatically adds them to git - */ -function createFile(string $templatePath, string $file): void -{ - echo "Creating $file\n"; - - if (file_exists($file)) { - $overwrite = false; - echo "A file named $file already exists, do you want to overwrite it? [y/N]\n"; - $choice = strtolower(readline('> ') ?: 'n'); - echo PHP_EOL; - if ($choice === 'y') { - $overwrite = true; - } elseif (! in_array($choice, ['y', 'n'], true)) { - error('Invalid response (must be "y" or "n"), aborting'); - } - if (! $overwrite) { - echo "Skipping $file\n"; - return; - } - } - - $template = file_get_contents("$templatePath/$file"); - if (! $template) { - error("Could not read file $templatePath/$file"); - } - $template = str_replace('PHP_VERSION', PHP_MAJOR_VERSION . PHP_MINOR_VERSION, $template); - file_put_contents($file, $template); - - /* - * We check if this is a git repository to automatically add file to git. - */ - $message = "$file successfully created"; - if ((new Process(['git', 'rev-parse', '--is-inside-work-tree']))->run() === 0) { - (new Process(['git', 'add', $file]))->run(); - $message .= ' and added to git automatically'; - } - - echo PHP_EOL; - success("$message."); -} diff --git a/template/function/index.php b/template/function/index.php deleted file mode 100644 index 346496cb7..000000000 --- a/template/function/index.php +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - Welcome! - - - - -
    -

    Hello there,

    -
    -
    - -
    -
    - - diff --git a/template/http/serverless.yml b/template/http/serverless.yml deleted file mode 100644 index 65f86f77e..000000000 --- a/template/http/serverless.yml +++ /dev/null @@ -1,27 +0,0 @@ -service: app - -# Set your team ID if you are using Bref Cloud -#bref: -# team: my-team-id - -provider: - name: aws - region: us-east-1 - -plugins: - - ./vendor/bref/bref - -functions: - api: - handler: index.php - description: '' - runtime: php-PHP_VERSION-fpm - timeout: 28 # in seconds (API Gateway has a timeout of 29 seconds) - events: - - httpApi: '*' - -# Exclude files from deployment -package: - patterns: - - '!node_modules/**' - - '!tests/**' diff --git a/template/symfony/serverless.yml b/template/symfony/serverless.yml deleted file mode 100644 index 48c49adb6..000000000 --- a/template/symfony/serverless.yml +++ /dev/null @@ -1,47 +0,0 @@ -# Read the documentation at https://bref.sh/docs/symfony/getting-started -service: symfony - -# Set your team ID if you are using Bref Cloud -#bref: -# team: my-team-id - -provider: - name: aws - # The AWS region in which to deploy (us-east-1 is the default) - region: us-east-1 - environment: - # Symfony environment variables - APP_ENV: prod - -plugins: - - ./vendor/bref/bref - -functions: - - # This function runs the Symfony website/API - web: - handler: public/index.php - runtime: php-82-fpm - timeout: 28 # in seconds (API Gateway has a timeout of 29 seconds) - events: - - httpApi: '*' - - # This function let us run console commands in Lambda - console: - handler: bin/console - runtime: php-82-console - timeout: 120 # in seconds - -package: - patterns: - # Excluded files and folders for deployment - - '!assets/**' - - '!node_modules/**' - - '!public/build/**' - - '!tests/**' - - '!var/**' - # If you want to include files and folders that are part of excluded folders, - # add them at the end - - 'var/cache/prod/**' - - 'public/build/entrypoints.json' - - 'public/build/manifest.json' diff --git a/tests/CliTest.php b/tests/CliTest.php deleted file mode 100644 index 09b03afc0..000000000 --- a/tests/CliTest.php +++ /dev/null @@ -1,16 +0,0 @@ -mustRun(); - self::assertNotEmpty($process->getOutput()); - } -} From b253d1447baf1a3670068bbc77c052feddae7a6b Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Mon, 1 Dec 2025 15:19:54 +0100 Subject: [PATCH 35/53] Drop support for unmaintained Symfony versions --- composer.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/composer.json b/composer.json index 5259d0b3f..aeb52f82e 100644 --- a/composer.json +++ b/composer.json @@ -30,7 +30,7 @@ "psr/http-message": "^1.0|^2.0", "psr/http-server-handler": "^1.0", "riverline/multipart-parser": "^2.1.2", - "symfony/process": "^4.4|^5.0|^6.0|^7.0|^8.0" + "symfony/process": "^5.4|^6.4|^7.0|^8.0" }, "require-dev": { "async-aws/core": "^1.0", @@ -42,8 +42,8 @@ "guzzlehttp/guzzle": "^7.5", "phpstan/phpstan": "^1.10.26", "phpunit/phpunit": "^9.6.10", - "symfony/console": "^4.4|^5.0|^6.0|^7.0|^8.0", - "symfony/yaml": "^4.4|^5.0|^6.0|^7.0|^8.0" + "symfony/console": "^5.4|^6.4|^7.0|^8.0", + "symfony/yaml": "^5.4|^6.4|^7.0|^8.0" }, "scripts": { "test": [ From a38f4878561e0c13fb6082f4bd64a432715b9c15 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Mon, 1 Dec 2025 15:28:06 +0100 Subject: [PATCH 36/53] Fix --- .phpcs.xml | 1 - phpstan.neon | 1 - 2 files changed, 2 deletions(-) diff --git a/.phpcs.xml b/.phpcs.xml index 7b6fa93b6..fcb99ca4b 100644 --- a/.phpcs.xml +++ b/.phpcs.xml @@ -7,7 +7,6 @@ - bref src tests diff --git a/phpstan.neon b/phpstan.neon index bcea319ff..337d37e45 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -1,7 +1,6 @@ parameters: level: 5 paths: - - bref - src - tests excludePaths: From 9630b6da676c0877751b56d585c3f428affc32b3 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Fri, 5 Dec 2025 23:32:21 +0100 Subject: [PATCH 37/53] v3 release notes --- docs/upgrading/v3.mdx | 234 +++++++++++++++++++++---- website/src/pages/news.mdx | 8 + website/src/pages/news/03-bref-3.0.mdx | 199 +++++++++++++++++++++ 3 files changed, 405 insertions(+), 36 deletions(-) create mode 100644 website/src/pages/news/03-bref-3.0.mdx diff --git a/docs/upgrading/v3.mdx b/docs/upgrading/v3.mdx index cbbf83344..308bbd647 100644 --- a/docs/upgrading/v3.mdx +++ b/docs/upgrading/v3.mdx @@ -2,8 +2,12 @@ introduction: Upgrading guide to go from Bref 2.x to Bref 3.0. --- +import { Callout } from 'nextra/components'; + # Upgrading to Bref 3.0 +Read the [Bref 3.0 release announcement](/news/03-bref-3.0) to learn about all the new features and improvements. + ## Updating dependencies ### PHP 8.2 required @@ -12,75 +16,101 @@ Bref 3.0 now requires PHP 8.2 or greater. ### Composer Dependencies -You should update the `bref/bref` dependency in your application's composer.json file: +Update all Bref packages in your `composer.json` file from `^2` to `^3`, for example: -```diff -- "bref/bref": "^2", -+ "bref/bref": "^3", +```json filename="composer.json" +"require": { + "bref/bref": "^3", + "bref/laravel-bridge": "^3", // if you use Laravel + "bref/symfony-bridge": "^3", // if you use Symfony + "bref/extra-php-extensions": "^3" // if you use extra extensions +} ``` -Then run `composer update bref/bref --with-all-dependencies`. + + Only update the versions for the packages you actually have in your project. + -If you use the [Bref Extra extensions](https://github.com/brefphp/extra-php-extensions), you also need to update the `bref/extra-php-extensions` package to version `^3.0`. +Then run: + +```bash +composer update --with-all-dependencies +``` ## Container image changes If you deploy using [container images](../deploy/docker.mdx), you must update your `Dockerfile`. -First, change the major version of the Bref base image: +Since Bref container images have been merged into a single `bref/php-xx` image, the following images don't exist anymore: `bref/php-xx-fpm` and `bref/php-xx-console`. + +### Option 1: Set BREF_RUNTIME in the Dockerfile + +The simplest upgrade path is to update your Dockerfile to use the unified image and set the runtime: ```diff filename="Dockerfile" - FROM bref/php-84-fpm:2 -+ FROM bref/php-84-fpm:3 ++ FROM bref/php-84:3 ++ ENV BREF_RUNTIME=fpm # ... ``` -Since Bref container images have been merged into a single `bref/php-xx` image, the following images don't exist anymore: `bref/php-xx-fpm` and `bref/php-xx-console`. +Replace `fpm` with `function` or `console` depending on your use case. -You must replace the base image to `bref/php-xx` when needed and define the `BREF_RUNTIME` environment variable: +### Option 2: Use one image for all function types (recommended) -```diff filename="Dockerfile" -FROM bref/php-84:3 +A major benefit of v3 is that you can now use **a single Docker image** for all your functions (web, console, queues, etc.) and set `BREF_RUNTIME` per function in `serverless.yml`. -+ ENV BREF_RUNTIME=function +**Dockerfile** (single image for everything): -# ... -``` - -or - -```diff filename="Dockerfile" -- FROM bref/php-84-fpm:3 -+ FROM bref/php-84:3 +```dockerfile filename="Dockerfile" +FROM bref/php-84:3 -+ ENV BREF_RUNTIME=fpm +# Your application code +COPY . /var/task -# ... +# No BREF_RUNTIME set here! ``` -or +**serverless.yml** (set runtime per function): -```diff filename="Dockerfile" -- FROM bref/php-84-console:3 -+ FROM bref/php-84:3 +```yml filename="serverless.yml" +functions: + web: + image: + name: my-app-image + environment: + BREF_RUNTIME: fpm # Web/HTTP function + events: + - httpApi: '*' + + console: + image: + name: my-app-image + environment: + BREF_RUNTIME: console # Console commands + + worker: + image: + name: my-app-image + environment: + BREF_RUNTIME: function # Queue worker + events: + - sqs: + arn: !GetAtt MyQueue.Arn +``` -+ ENV BREF_RUNTIME=console +This approach lets you build and deploy a single Docker image for all function types, simplifying your deployment pipeline. -# ... -``` +### Local development images -Separately, if you use the `bref/php-84-fpm-dev` image for local development, you need to update its name and version: +If you use the `bref/php-84-fpm-dev` image for local development, update it to: -```diff filename="Dockerfile" +```diff filename="docker-compose.yml" - FROM bref/php-84-fpm-dev:2 + FROM bref/php-84-dev:3 - -# ... ``` -The rest works as usual. - ## Smaller breaking changes that might impact you The changes below should not impact the majority of users. However, if you are using any of these features, you might need to update your code. @@ -214,3 +244,135 @@ Under the hood, **all layers have been merged into one**, i.e. `php-xx-fpm` and The examples above assume you are using PHP 8.4 (`php-84`) but you can replace `84` with another PHP version. +### The `vendor/bin/bref` CLI has been removed + +The `vendor/bin/bref` CLI has been completely removed in Bref 3.0. This is a minor change since the CLI was already 90% removed in Bref 2.0 - only the `bref init` command remained for bootstrapping new projects. + +We now have better onboarding with improved documentation. Here are the alternatives: + +- **Scaffolding new projects**: Follow the [getting started guide](/docs/setup) to create your `serverless.yml` manually. +- **Layer versions**: Visit [runtimes.bref.sh](https://runtimes.bref.sh/) or run `serverless bref:layers`. +- **Running console commands**: Use `serverless bref:cli` (unchanged from v2). +- **Local development**: Use [Docker-based local development](/docs/local-development). + +### The hooks system has been removed + +The deprecated hooks system has been removed. This change affects very few users (less than 1%) as it was a low-level API used primarily by framework integrations. + +If you were using `Bref::beforeStartup()` or `Bref::beforeInvoke()`, you must migrate to the `BrefEventSubscriber` pattern: + +Before: + +```php +use Bref\Bref; + +Bref::beforeStartup(function () { + // Setup code +}); +``` + +After: + +```php +use Bref\Bref; +use Bref\Listener\BrefEventSubscriber; + +class MyEventSubscriber extends BrefEventSubscriber +{ + public function beforeStartup(): void + { + // Setup code + } +} + +Bref::events()->subscribe(new MyEventSubscriber()); +``` + +The `BrefEventSubscriber` class provides additional hooks: `afterStartup()`, `beforeInvoke()`, and `afterInvoke()`. This refactor powers better integrations like the [Laravel bridge](https://github.com/brefphp/laravel-bridge), [X-Ray integration](https://bref.sh/xray), and [Sentry integration](https://bref.sh/sentry). + +### SOAP extension is now disabled by default + +The SOAP PHP extension is now disabled by default. It had very little usage, and disabling it helped reduce layer sizes to make room for more commonly used extensions. + +If you need the SOAP extension, you can enable it by creating a `php.ini` file in your project: + +```ini filename="php/conf.d/soap.ini" +extension=soap +``` + +And reference it in your `serverless.yml`: + +```yml filename="serverless.yml" +provider: + environment: + BREF_AUTOLOAD_PATH: php/conf.d +``` + +### Laravel users + +If you are using Laravel with Bref, note that: + +- **Laravel 10, 11, or 12 is required** (Laravel 8 and 9 are no longer supported). +- Update `bref/laravel-bridge` to the latest version. + +The Laravel bridge has been updated to use the new `BrefEventSubscriber` pattern internally, but this change is transparent to users. + +### CloudWatch log formatter enabled by default + +The [Bref Monolog formatter](https://github.com/brefphp/monolog-bridge) is now enabled by default in the Laravel and Symfony bridges. + +**This changes how your logs will look.** Logs now use a hybrid format that combines human-readable text with structured JSON: + +Before (plain text): +``` +[2025-12-05 10:30:45] production.ERROR: Database connection failed +``` + +After (structured format): +``` +ERROR Database connection failed {"message":"Database connection failed","level":"ERROR","context":{...}} +``` + +This format makes logs easier to read in CloudWatch and enables powerful filtering with CloudWatch Logs Insights (e.g., filter by log level or exception class). + +**Exception handling is greatly improved:** Previously, exception stack traces were split across multiple CloudWatch log records (one per line), making them difficult to read and browse. Now, the entire exception (including stack trace) is grouped in a single JSON object, making debugging much easier. + +If you prefer the old format, you can disable the formatter in your Laravel or Symfony configuration. See the [Bref Monolog documentation](https://github.com/brefphp/monolog-bridge) for details. + +## Cleanup: Remove deprecated configurations + +The following improvements in Bref 3.0 let you clean up old configurations. + +### Redis extension is now built-in + +The Redis PHP extension is now included in Bref layers by default. + +If you were using the Redis extension from [bref/extra-php-extensions](https://github.com/brefphp/extra-php-extensions), remove it from your `serverless.yml`: + +```diff filename="serverless.yml" +functions: + api: + # ... + layers: +- - ${bref-extra:redis-php-84} +``` + +If Redis was the only extra extension you were using, you can also uninstall the package: + +```bash +composer remove bref/extra-php-extensions +``` + +### PostgreSQL extension is enabled by default + +The PostgreSQL PDO extension (`pdo_pgsql`) is now enabled by default in Bref layers. + +If you had enabled it manually via a `php.ini` file, you can remove that line: + +```diff filename="php/conf.d/php.ini" +-extension=pdo_pgsql +``` + +--- + +That's it! Read the [Bref 3.0 release announcement](/news/03-bref-3.0) to learn more about all the new features and improvements in this release. diff --git a/website/src/pages/news.mdx b/website/src/pages/news.mdx index 471b4ecb0..a0ca257c5 100644 --- a/website/src/pages/news.mdx +++ b/website/src/pages/news.mdx @@ -9,6 +9,14 @@ import { NextSeo } from 'next-seo'; +## [Bref 3.0 is released 🎉](./news/03-bref-3.0.mdx) + +Bref 3.0 is here! Since Bref 2.0, we've grown from 10 billion to **40 billion Lambda executions** every month. The package has been installed more than **8 million times**, and we've crossed **4,000 commits** across all Bref repositories. + +Today, we celebrate these achievements and **the release of Bref 3.0** 🎉 + +[▶ Read more](./news/03-bref-3.0.mdx) + ## [Bref 2.0 is released 🎉](./news/02-bref-2.0.md) The work on what would be Bref 2.0 started in October 2021, about 1.5 year ago. We went through many different strategies, experiments, rewrites, over **700 commits** to finally land with the stable release. diff --git a/website/src/pages/news/03-bref-3.0.mdx b/website/src/pages/news/03-bref-3.0.mdx new file mode 100644 index 000000000..6c6de9afa --- /dev/null +++ b/website/src/pages/news/03-bref-3.0.mdx @@ -0,0 +1,199 @@ +import ArticleHeader from '../../components/news/ArticleHeader'; +import { NextSeo } from 'next-seo'; + + + +# Bref 3.0 is released 🎉 + + + +Bref 3.0 is here! Since Bref 2.0, we've grown from 10 billion to **40 billion Lambda executions** (aka requests) every month. The package has been installed more than **8 million times**, and we've crossed **4,000 commits** across all Bref repositories. + +Today, we celebrate these achievements and **the release of Bref 3.0** 🎉 + +Let's check out what's new in v3. + +## Bref 3.0 + +Here's a summary, we'll dive into the details below: + +- **24% smaller layers** for faster cold starts. +- **Amazon Linux 2023**: modern, secure infrastructure with AWS-managed security patches. +- **PHP 8.5 support** and the **Redis extension** is now built-in. +- **PostgreSQL extension** is now enabled by default. +- **Bref Cloud**: a simpler way to deploy Bref applications. +- **Unified PHP runtime**: one layer and one container image instead of three, simpler mental model. +- **New regions**: `ap-southeast-3` and `me-central-1`. +- **Better CloudWatch logs** with the new Monolog formatter enabled by default. + +What did we break? **Almost nothing**, the upgrade should be smooth. Here are the details: + +- PHP 8.2+ is now required (PHP 8.0 and 8.1 support is dropped). +- The `vendor/bin/bref` CLI is removed (it was already 90% removed in v2). +- The SOAP extension is now opt-in (it had very little usage). +- If you deploy using container images, you'll need to update your Dockerfile. + +For a complete list of changes and instructions, check out the [**v3 upgrade guide**](../docs/upgrading/v3.mdx). + +## Faster Lambda cold starts + +We've reduced the size of Bref layers by **24%**, which should improve cold start times. Here are the size reductions: + +- PHP 8.4: 69MB → 53MB +- PHP 8.3: 65MB → 46MB + +This was achieved through several optimizations: + +- Stripping debug symbols from all libraries and PHP extensions. +- Compiling PHP with size-optimization flags. +- Disabling the rarely-used SOAP extension by default. +- Bundling PDO-MySQL directly into the PHP binary. + +## Amazon Linux 2023 + +Bref 3.0 is built on **Amazon Linux 2023** (AL2023), the latest version of Amazon's Linux distribution for AWS. + +This upgrade brings several benefits: + +- **Security**: AWS handles CVEs and security patches at the OS level. Security updates are backported and documented in AWS advisories. +- **Modern packages**: AL2023 ships with more recent versions of system libraries, reducing the need for custom compilation. +- **Long-term support**: AL2023 follows AWS's support lifecycle, ensuring stability. + +The migration happens automatically when you upgrade to Bref 3.0 - no changes needed on your end. + +## PHP 8.5 support + +Bref 3.0 adds support for **PHP 8.5**! You can start using it by setting the runtime in your `serverless.yml`: + +```yaml +functions: + api: + handler: public/index.php + runtime: php-85-fpm +``` + +## Redis extension built-in + +The **Redis extension** is now included in Bref layers by default. Redis is one of the most used extensions by Bref users for caching and session storage. + +No more installing the extension separately, it just works! + +If you were using the Redis extension from [bref/extra-php-extensions](https://github.com/brefphp/extra-php-extensions), you can remove it from your `serverless.yml`: + +```diff filename="serverless.yml" +functions: + api: + # ... + layers: +- - ${bref-extra:redis-php-84} +``` + +If Redis was the only extra extension you were using, you can uninstall the package entirely: + +```bash +composer remove bref/extra-php-extensions +``` + +## PostgreSQL enabled by default + +The **PostgreSQL PDO extension** is now enabled by default. If you're using PostgreSQL, you no longer need any additional configuration. + +If you had enabled it manually via a `php.ini` file, you can remove that line: + +```diff filename="php/conf.d/php.ini" +-extension=pdo_pgsql +``` + +## Bref Cloud + +**[Bref Cloud](https://bref.sh/cloud)** is a new way to deploy Bref applications. It simplifies the deployment process and provides a dashboard to manage your applications. + +If you want to skip the AWS credential setup and get started quickly, check out [Bref Cloud](https://bref.sh/cloud). + +## Unified PHP runtime + +Bref 3.0 consolidates the three separate layer types (function, FPM, console) into a **single unified layer** per PHP version. This simplification makes maintenance easier and provides a simpler mental model for users. + +**Do you need to change anything?** + +- **If you use `runtime: php-84-fpm` in your `serverless.yml`**: nothing changes, you're all set! +- **If you deploy using container images**: you need to update your `Dockerfile`, ⚠️ read the [upgrade guide](../docs/upgrading/v3.mdx#updating-your-dockerfile-for-bref-30). +- **If you specify layers explicitly**: ⚠️ read the [upgrade guide](../docs/upgrading/v3.mdx#aws-lambda-layers-have-been-merged-into-a-single-layer). + +A single layer/image is how it should have been from the start, and I'm really glad we're getting there now! + +## Better CloudWatch logs + +The [Bref Monolog formatter](https://github.com/brefphp/monolog-bridge) is now **enabled by default** in the Laravel and Symfony bridges. This formatter outputs logs in a format optimized for CloudWatch, making them easier to read and filter. + +## New regions + +Bref layers are now available in two additional regions: + +- `ap-southeast-3` (Asia Pacific - Jakarta) +- `me-central-1` (Middle East - UAE) + +## The `vendor/bin/bref` CLI is removed + +The `vendor/bin/bref` CLI has been completely removed in Bref 3.0. This is a minor change since the CLI was already 90% removed in Bref 2.0 - only the `bref init` command remained for bootstrapping new projects. + +We now have better onboarding with improved documentation and the `serverless` CLI commands. Here are the alternatives: + +- **Scaffolding new projects**: Follow the [getting started guide](https://bref.sh/docs/setup) to create your `serverless.yml` manually. +- **Layer versions**: Visit [runtimes.bref.sh](https://runtimes.bref.sh/) or run `serverless bref:layers`. +- **Running console commands**: Use `serverless bref:cli` (this existed in v2). +- **Local development**: Use [Docker-based local development](https://bref.sh/docs/local-development). + +## Thanks + +A huge thanks to the [Bref contributors](https://github.com/brefphp/bref/graphs/contributors), to the community for supporting the project, and to the open-source sponsors: + +**Premium sponsors:** + +- [Craft CMS](https://craftcms.com/?ref=bref.sh) +- [Voxie](https://voxie.com/?ref=bref) +- [MyBuilder](https://www.mybuilder.com/?ref=bref.sh) + +**Gold sponsors:** + +- [Depot](https://depot.dev/?ref=bref.sh) +- [SecuMailer](https://secumailer.com/?ref=bref.sh) +- [Ecomail](https://ecomail.cz/?ref=bref.sh) +- [Spreaker](https://www.spreaker.com/?ref=bref) +- [Runs On](https://runs-on.com/?ref=bref) +- [Playable](https://playable.com/?ref=bref) + +And [many other personal sponsors](https://github.com/sponsors/mnapoli#sponsors)! + +Thank you all! + +## That's it! + +Hope you enjoy Bref v3! + +There is a complete [**v3 Upgrade Guide**](../docs/upgrading/v3.mdx) that you can follow. + +Head to the docs to [**get started with Bref**](../), or check out the documentation for [Laravel](../docs/laravel/getting-started.mdx) or [Symfony](../docs/symfony/getting-started.mdx). + +You can also join the community [in Slack](/docs/community.md), post details about your project in [Built with Bref](https://github.com/brefphp/bref/issues/267), or share your experience online and mention [@brefphp](https://twitter.com/brefphp) on Twitter. + +## One more thing + +Check out **[Bref Cloud](https://bref.sh/cloud)** for a simpler way to deploy and monitor your Bref applications! + + From 5dce7a856dfecf848d4da45717d49e3c6dcf5071 Mon Sep 17 00:00:00 2001 From: mnapoli <720328+mnapoli@users.noreply.github.com> Date: Mon, 8 Dec 2025 20:12:17 +0000 Subject: [PATCH 38/53] Update layer versions --- layers.json | 384 ++++++++++++++++++++++++++-------------------------- 1 file changed, 192 insertions(+), 192 deletions(-) diff --git a/layers.json b/layers.json index 015ca0fe9..f8ddad420 100644 --- a/layers.json +++ b/layers.json @@ -1,210 +1,210 @@ { "php-85": { - "ca-central-1": "7", - "eu-central-1": "7", - "eu-north-1": "7", - "eu-west-1": "7", - "eu-west-2": "7", - "eu-west-3": "7", - "sa-east-1": "7", - "us-east-1": "7", - "us-east-2": "7", - "us-west-1": "7", - "us-west-2": "7", - "ap-east-1": "7", - "ap-south-1": "7", - "ap-northeast-1": "7", - "ap-northeast-2": "7", - "ap-northeast-3": "7", - "ap-southeast-1": "7", - "ap-southeast-2": "7", - "ap-southeast-3": "7", - "eu-south-1": "7", - "eu-south-2": "7", - "af-south-1": "7", - "me-south-1": "7", - "me-central-1": "7" + "ca-central-1": "8", + "eu-central-1": "8", + "eu-north-1": "8", + "eu-west-1": "8", + "eu-west-2": "8", + "eu-west-3": "8", + "sa-east-1": "8", + "us-east-1": "8", + "us-east-2": "8", + "us-west-1": "8", + "us-west-2": "8", + "ap-east-1": "8", + "ap-south-1": "8", + "ap-northeast-1": "8", + "ap-northeast-2": "8", + "ap-northeast-3": "8", + "ap-southeast-1": "8", + "ap-southeast-2": "8", + "ap-southeast-3": "8", + "eu-south-1": "8", + "eu-south-2": "8", + "af-south-1": "8", + "me-south-1": "8", + "me-central-1": "8" }, "php-84": { - "ca-central-1": "10", - "eu-central-1": "10", - "eu-north-1": "10", - "eu-west-1": "10", - "eu-west-2": "10", - "eu-west-3": "10", - "sa-east-1": "10", - "us-east-1": "10", - "us-east-2": "10", - "us-west-1": "10", - "us-west-2": "10", - "ap-east-1": "10", - "ap-south-1": "10", - "ap-northeast-1": "10", - "ap-northeast-2": "10", - "ap-northeast-3": "10", - "ap-southeast-1": "10", - "ap-southeast-2": "10", - "ap-southeast-3": "10", - "eu-south-1": "10", - "eu-south-2": "10", - "af-south-1": "10", - "me-south-1": "10", - "me-central-1": "10" + "ca-central-1": "11", + "eu-central-1": "11", + "eu-north-1": "11", + "eu-west-1": "11", + "eu-west-2": "11", + "eu-west-3": "11", + "sa-east-1": "11", + "us-east-1": "11", + "us-east-2": "11", + "us-west-1": "11", + "us-west-2": "11", + "ap-east-1": "11", + "ap-south-1": "11", + "ap-northeast-1": "11", + "ap-northeast-2": "11", + "ap-northeast-3": "11", + "ap-southeast-1": "11", + "ap-southeast-2": "11", + "ap-southeast-3": "11", + "eu-south-1": "11", + "eu-south-2": "11", + "af-south-1": "11", + "me-south-1": "11", + "me-central-1": "11" }, "php-83": { - "ca-central-1": "10", - "eu-central-1": "10", - "eu-north-1": "10", - "eu-west-1": "10", - "eu-west-2": "10", - "eu-west-3": "10", - "sa-east-1": "10", - "us-east-1": "10", - "us-east-2": "10", - "us-west-1": "10", - "us-west-2": "10", - "ap-east-1": "10", - "ap-south-1": "10", - "ap-northeast-1": "10", - "ap-northeast-2": "10", - "ap-northeast-3": "10", - "ap-southeast-1": "10", - "ap-southeast-2": "10", - "ap-southeast-3": "10", - "eu-south-1": "10", - "eu-south-2": "10", - "af-south-1": "10", - "me-south-1": "10", - "me-central-1": "10" + "ca-central-1": "11", + "eu-central-1": "11", + "eu-north-1": "11", + "eu-west-1": "11", + "eu-west-2": "11", + "eu-west-3": "11", + "sa-east-1": "11", + "us-east-1": "11", + "us-east-2": "11", + "us-west-1": "11", + "us-west-2": "11", + "ap-east-1": "11", + "ap-south-1": "11", + "ap-northeast-1": "11", + "ap-northeast-2": "11", + "ap-northeast-3": "11", + "ap-southeast-1": "11", + "ap-southeast-2": "11", + "ap-southeast-3": "11", + "eu-south-1": "11", + "eu-south-2": "11", + "af-south-1": "11", + "me-south-1": "11", + "me-central-1": "11" }, "php-82": { - "ca-central-1": "10", - "eu-central-1": "10", - "eu-north-1": "10", - "eu-west-1": "10", - "eu-west-2": "10", - "eu-west-3": "10", - "sa-east-1": "10", - "us-east-1": "10", - "us-east-2": "10", - "us-west-1": "10", - "us-west-2": "10", - "ap-east-1": "10", - "ap-south-1": "10", - "ap-northeast-1": "10", - "ap-northeast-2": "10", - "ap-northeast-3": "10", - "ap-southeast-1": "10", - "ap-southeast-2": "10", - "ap-southeast-3": "10", - "eu-south-1": "10", - "eu-south-2": "10", - "af-south-1": "10", - "me-south-1": "10", - "me-central-1": "10" + "ca-central-1": "11", + "eu-central-1": "11", + "eu-north-1": "11", + "eu-west-1": "11", + "eu-west-2": "11", + "eu-west-3": "11", + "sa-east-1": "11", + "us-east-1": "11", + "us-east-2": "11", + "us-west-1": "11", + "us-west-2": "11", + "ap-east-1": "11", + "ap-south-1": "11", + "ap-northeast-1": "11", + "ap-northeast-2": "11", + "ap-northeast-3": "11", + "ap-southeast-1": "11", + "ap-southeast-2": "11", + "ap-southeast-3": "11", + "eu-south-1": "11", + "eu-south-2": "11", + "af-south-1": "11", + "me-south-1": "11", + "me-central-1": "11" }, "arm-php-85": { - "ca-central-1": "7", - "eu-central-1": "7", - "eu-north-1": "7", - "eu-west-1": "7", - "eu-west-2": "7", - "eu-west-3": "7", - "sa-east-1": "7", - "us-east-1": "7", - "us-east-2": "7", - "us-west-1": "7", - "us-west-2": "7", - "ap-east-1": "7", - "ap-south-1": "7", - "ap-northeast-1": "7", - "ap-northeast-2": "7", - "ap-northeast-3": "7", - "ap-southeast-1": "7", - "ap-southeast-2": "7", - "ap-southeast-3": "7", - "eu-south-1": "7", - "eu-south-2": "7", - "af-south-1": "7", - "me-south-1": "7", - "me-central-1": "7" + "ca-central-1": "8", + "eu-central-1": "8", + "eu-north-1": "8", + "eu-west-1": "8", + "eu-west-2": "8", + "eu-west-3": "8", + "sa-east-1": "8", + "us-east-1": "8", + "us-east-2": "8", + "us-west-1": "8", + "us-west-2": "8", + "ap-east-1": "8", + "ap-south-1": "8", + "ap-northeast-1": "8", + "ap-northeast-2": "8", + "ap-northeast-3": "8", + "ap-southeast-1": "8", + "ap-southeast-2": "8", + "ap-southeast-3": "8", + "eu-south-1": "8", + "eu-south-2": "8", + "af-south-1": "8", + "me-south-1": "8", + "me-central-1": "8" }, "arm-php-84": { - "ca-central-1": "10", - "eu-central-1": "10", - "eu-north-1": "10", - "eu-west-1": "10", - "eu-west-2": "10", - "eu-west-3": "10", - "sa-east-1": "10", - "us-east-1": "10", - "us-east-2": "10", - "us-west-1": "10", - "us-west-2": "10", - "ap-east-1": "10", - "ap-south-1": "10", - "ap-northeast-1": "10", - "ap-northeast-2": "10", - "ap-northeast-3": "10", - "ap-southeast-1": "10", - "ap-southeast-2": "10", - "ap-southeast-3": "10", - "eu-south-1": "10", - "eu-south-2": "10", - "af-south-1": "10", - "me-south-1": "10", - "me-central-1": "10" + "ca-central-1": "11", + "eu-central-1": "11", + "eu-north-1": "11", + "eu-west-1": "11", + "eu-west-2": "11", + "eu-west-3": "11", + "sa-east-1": "11", + "us-east-1": "11", + "us-east-2": "11", + "us-west-1": "11", + "us-west-2": "11", + "ap-east-1": "11", + "ap-south-1": "11", + "ap-northeast-1": "11", + "ap-northeast-2": "11", + "ap-northeast-3": "11", + "ap-southeast-1": "11", + "ap-southeast-2": "11", + "ap-southeast-3": "11", + "eu-south-1": "11", + "eu-south-2": "11", + "af-south-1": "11", + "me-south-1": "11", + "me-central-1": "11" }, "arm-php-83": { - "ca-central-1": "10", - "eu-central-1": "10", - "eu-north-1": "10", - "eu-west-1": "10", - "eu-west-2": "10", - "eu-west-3": "10", - "sa-east-1": "10", - "us-east-1": "10", - "us-east-2": "10", - "us-west-1": "10", - "us-west-2": "10", - "ap-east-1": "10", - "ap-south-1": "10", - "ap-northeast-1": "10", - "ap-northeast-2": "10", - "ap-northeast-3": "10", - "ap-southeast-1": "10", - "ap-southeast-2": "10", - "ap-southeast-3": "10", - "eu-south-1": "10", - "eu-south-2": "10", - "af-south-1": "10", - "me-south-1": "10", - "me-central-1": "10" + "ca-central-1": "11", + "eu-central-1": "11", + "eu-north-1": "11", + "eu-west-1": "11", + "eu-west-2": "11", + "eu-west-3": "11", + "sa-east-1": "11", + "us-east-1": "11", + "us-east-2": "11", + "us-west-1": "11", + "us-west-2": "11", + "ap-east-1": "11", + "ap-south-1": "11", + "ap-northeast-1": "11", + "ap-northeast-2": "11", + "ap-northeast-3": "11", + "ap-southeast-1": "11", + "ap-southeast-2": "11", + "ap-southeast-3": "11", + "eu-south-1": "11", + "eu-south-2": "11", + "af-south-1": "11", + "me-south-1": "11", + "me-central-1": "11" }, "arm-php-82": { - "ca-central-1": "10", - "eu-central-1": "10", - "eu-north-1": "10", - "eu-west-1": "10", - "eu-west-2": "10", - "eu-west-3": "10", - "sa-east-1": "10", - "us-east-1": "10", - "us-east-2": "10", - "us-west-1": "10", - "us-west-2": "10", - "ap-east-1": "10", - "ap-south-1": "10", - "ap-northeast-1": "10", - "ap-northeast-2": "10", - "ap-northeast-3": "10", - "ap-southeast-1": "10", - "ap-southeast-2": "10", - "ap-southeast-3": "10", - "eu-south-1": "10", - "eu-south-2": "10", - "af-south-1": "10", - "me-south-1": "10", - "me-central-1": "10" + "ca-central-1": "11", + "eu-central-1": "11", + "eu-north-1": "11", + "eu-west-1": "11", + "eu-west-2": "11", + "eu-west-3": "11", + "sa-east-1": "11", + "us-east-1": "11", + "us-east-2": "11", + "us-west-1": "11", + "us-west-2": "11", + "ap-east-1": "11", + "ap-south-1": "11", + "ap-northeast-1": "11", + "ap-northeast-2": "11", + "ap-northeast-3": "11", + "ap-southeast-1": "11", + "ap-southeast-2": "11", + "ap-southeast-3": "11", + "eu-south-1": "11", + "eu-south-2": "11", + "af-south-1": "11", + "me-south-1": "11", + "me-central-1": "11" } } \ No newline at end of file From 05697b64039e9f87798553214b306fe758393ce3 Mon Sep 17 00:00:00 2001 From: mnapoli <720328+mnapoli@users.noreply.github.com> Date: Mon, 15 Dec 2025 17:10:15 +0000 Subject: [PATCH 39/53] Update layer versions --- layers.json | 384 ++++++++++++++++++++++++++-------------------------- 1 file changed, 192 insertions(+), 192 deletions(-) diff --git a/layers.json b/layers.json index f8ddad420..c71c28e17 100644 --- a/layers.json +++ b/layers.json @@ -1,210 +1,210 @@ { "php-85": { - "ca-central-1": "8", - "eu-central-1": "8", - "eu-north-1": "8", - "eu-west-1": "8", - "eu-west-2": "8", - "eu-west-3": "8", - "sa-east-1": "8", - "us-east-1": "8", - "us-east-2": "8", - "us-west-1": "8", - "us-west-2": "8", - "ap-east-1": "8", - "ap-south-1": "8", - "ap-northeast-1": "8", - "ap-northeast-2": "8", - "ap-northeast-3": "8", - "ap-southeast-1": "8", - "ap-southeast-2": "8", - "ap-southeast-3": "8", - "eu-south-1": "8", - "eu-south-2": "8", - "af-south-1": "8", - "me-south-1": "8", - "me-central-1": "8" + "ca-central-1": "9", + "eu-central-1": "9", + "eu-north-1": "9", + "eu-west-1": "9", + "eu-west-2": "9", + "eu-west-3": "9", + "sa-east-1": "9", + "us-east-1": "9", + "us-east-2": "9", + "us-west-1": "9", + "us-west-2": "9", + "ap-east-1": "9", + "ap-south-1": "9", + "ap-northeast-1": "9", + "ap-northeast-2": "9", + "ap-northeast-3": "9", + "ap-southeast-1": "9", + "ap-southeast-2": "9", + "ap-southeast-3": "9", + "eu-south-1": "9", + "eu-south-2": "9", + "af-south-1": "9", + "me-south-1": "9", + "me-central-1": "9" }, "php-84": { - "ca-central-1": "11", - "eu-central-1": "11", - "eu-north-1": "11", - "eu-west-1": "11", - "eu-west-2": "11", - "eu-west-3": "11", - "sa-east-1": "11", - "us-east-1": "11", - "us-east-2": "11", - "us-west-1": "11", - "us-west-2": "11", - "ap-east-1": "11", - "ap-south-1": "11", - "ap-northeast-1": "11", - "ap-northeast-2": "11", - "ap-northeast-3": "11", - "ap-southeast-1": "11", - "ap-southeast-2": "11", - "ap-southeast-3": "11", - "eu-south-1": "11", - "eu-south-2": "11", - "af-south-1": "11", - "me-south-1": "11", - "me-central-1": "11" + "ca-central-1": "12", + "eu-central-1": "12", + "eu-north-1": "12", + "eu-west-1": "12", + "eu-west-2": "12", + "eu-west-3": "12", + "sa-east-1": "12", + "us-east-1": "12", + "us-east-2": "12", + "us-west-1": "12", + "us-west-2": "12", + "ap-east-1": "12", + "ap-south-1": "12", + "ap-northeast-1": "12", + "ap-northeast-2": "12", + "ap-northeast-3": "12", + "ap-southeast-1": "12", + "ap-southeast-2": "12", + "ap-southeast-3": "12", + "eu-south-1": "12", + "eu-south-2": "12", + "af-south-1": "12", + "me-south-1": "12", + "me-central-1": "12" }, "php-83": { - "ca-central-1": "11", - "eu-central-1": "11", - "eu-north-1": "11", - "eu-west-1": "11", - "eu-west-2": "11", - "eu-west-3": "11", - "sa-east-1": "11", - "us-east-1": "11", - "us-east-2": "11", - "us-west-1": "11", - "us-west-2": "11", - "ap-east-1": "11", - "ap-south-1": "11", - "ap-northeast-1": "11", - "ap-northeast-2": "11", - "ap-northeast-3": "11", - "ap-southeast-1": "11", - "ap-southeast-2": "11", - "ap-southeast-3": "11", - "eu-south-1": "11", - "eu-south-2": "11", - "af-south-1": "11", - "me-south-1": "11", - "me-central-1": "11" + "ca-central-1": "12", + "eu-central-1": "12", + "eu-north-1": "12", + "eu-west-1": "12", + "eu-west-2": "12", + "eu-west-3": "12", + "sa-east-1": "12", + "us-east-1": "12", + "us-east-2": "12", + "us-west-1": "12", + "us-west-2": "12", + "ap-east-1": "12", + "ap-south-1": "12", + "ap-northeast-1": "12", + "ap-northeast-2": "12", + "ap-northeast-3": "12", + "ap-southeast-1": "12", + "ap-southeast-2": "12", + "ap-southeast-3": "12", + "eu-south-1": "12", + "eu-south-2": "12", + "af-south-1": "12", + "me-south-1": "12", + "me-central-1": "12" }, "php-82": { - "ca-central-1": "11", - "eu-central-1": "11", - "eu-north-1": "11", - "eu-west-1": "11", - "eu-west-2": "11", - "eu-west-3": "11", - "sa-east-1": "11", - "us-east-1": "11", - "us-east-2": "11", - "us-west-1": "11", - "us-west-2": "11", - "ap-east-1": "11", - "ap-south-1": "11", - "ap-northeast-1": "11", - "ap-northeast-2": "11", - "ap-northeast-3": "11", - "ap-southeast-1": "11", - "ap-southeast-2": "11", - "ap-southeast-3": "11", - "eu-south-1": "11", - "eu-south-2": "11", - "af-south-1": "11", - "me-south-1": "11", - "me-central-1": "11" + "ca-central-1": "12", + "eu-central-1": "12", + "eu-north-1": "12", + "eu-west-1": "12", + "eu-west-2": "12", + "eu-west-3": "12", + "sa-east-1": "12", + "us-east-1": "12", + "us-east-2": "12", + "us-west-1": "12", + "us-west-2": "12", + "ap-east-1": "12", + "ap-south-1": "12", + "ap-northeast-1": "12", + "ap-northeast-2": "12", + "ap-northeast-3": "12", + "ap-southeast-1": "12", + "ap-southeast-2": "12", + "ap-southeast-3": "12", + "eu-south-1": "12", + "eu-south-2": "12", + "af-south-1": "12", + "me-south-1": "12", + "me-central-1": "12" }, "arm-php-85": { - "ca-central-1": "8", - "eu-central-1": "8", - "eu-north-1": "8", - "eu-west-1": "8", - "eu-west-2": "8", - "eu-west-3": "8", - "sa-east-1": "8", - "us-east-1": "8", - "us-east-2": "8", - "us-west-1": "8", - "us-west-2": "8", - "ap-east-1": "8", - "ap-south-1": "8", - "ap-northeast-1": "8", - "ap-northeast-2": "8", - "ap-northeast-3": "8", - "ap-southeast-1": "8", - "ap-southeast-2": "8", - "ap-southeast-3": "8", - "eu-south-1": "8", - "eu-south-2": "8", - "af-south-1": "8", - "me-south-1": "8", - "me-central-1": "8" + "ca-central-1": "9", + "eu-central-1": "9", + "eu-north-1": "9", + "eu-west-1": "9", + "eu-west-2": "9", + "eu-west-3": "9", + "sa-east-1": "9", + "us-east-1": "9", + "us-east-2": "9", + "us-west-1": "9", + "us-west-2": "9", + "ap-east-1": "9", + "ap-south-1": "9", + "ap-northeast-1": "9", + "ap-northeast-2": "9", + "ap-northeast-3": "9", + "ap-southeast-1": "9", + "ap-southeast-2": "9", + "ap-southeast-3": "9", + "eu-south-1": "9", + "eu-south-2": "9", + "af-south-1": "9", + "me-south-1": "9", + "me-central-1": "9" }, "arm-php-84": { - "ca-central-1": "11", - "eu-central-1": "11", - "eu-north-1": "11", - "eu-west-1": "11", - "eu-west-2": "11", - "eu-west-3": "11", - "sa-east-1": "11", - "us-east-1": "11", - "us-east-2": "11", - "us-west-1": "11", - "us-west-2": "11", - "ap-east-1": "11", - "ap-south-1": "11", - "ap-northeast-1": "11", - "ap-northeast-2": "11", - "ap-northeast-3": "11", - "ap-southeast-1": "11", - "ap-southeast-2": "11", - "ap-southeast-3": "11", - "eu-south-1": "11", - "eu-south-2": "11", - "af-south-1": "11", - "me-south-1": "11", - "me-central-1": "11" + "ca-central-1": "12", + "eu-central-1": "12", + "eu-north-1": "12", + "eu-west-1": "12", + "eu-west-2": "12", + "eu-west-3": "12", + "sa-east-1": "12", + "us-east-1": "12", + "us-east-2": "12", + "us-west-1": "12", + "us-west-2": "12", + "ap-east-1": "12", + "ap-south-1": "12", + "ap-northeast-1": "12", + "ap-northeast-2": "12", + "ap-northeast-3": "12", + "ap-southeast-1": "12", + "ap-southeast-2": "12", + "ap-southeast-3": "12", + "eu-south-1": "12", + "eu-south-2": "12", + "af-south-1": "12", + "me-south-1": "12", + "me-central-1": "12" }, "arm-php-83": { - "ca-central-1": "11", - "eu-central-1": "11", - "eu-north-1": "11", - "eu-west-1": "11", - "eu-west-2": "11", - "eu-west-3": "11", - "sa-east-1": "11", - "us-east-1": "11", - "us-east-2": "11", - "us-west-1": "11", - "us-west-2": "11", - "ap-east-1": "11", - "ap-south-1": "11", - "ap-northeast-1": "11", - "ap-northeast-2": "11", - "ap-northeast-3": "11", - "ap-southeast-1": "11", - "ap-southeast-2": "11", - "ap-southeast-3": "11", - "eu-south-1": "11", - "eu-south-2": "11", - "af-south-1": "11", - "me-south-1": "11", - "me-central-1": "11" + "ca-central-1": "12", + "eu-central-1": "12", + "eu-north-1": "12", + "eu-west-1": "12", + "eu-west-2": "12", + "eu-west-3": "12", + "sa-east-1": "12", + "us-east-1": "12", + "us-east-2": "12", + "us-west-1": "12", + "us-west-2": "12", + "ap-east-1": "12", + "ap-south-1": "12", + "ap-northeast-1": "12", + "ap-northeast-2": "12", + "ap-northeast-3": "12", + "ap-southeast-1": "12", + "ap-southeast-2": "12", + "ap-southeast-3": "12", + "eu-south-1": "12", + "eu-south-2": "12", + "af-south-1": "12", + "me-south-1": "12", + "me-central-1": "12" }, "arm-php-82": { - "ca-central-1": "11", - "eu-central-1": "11", - "eu-north-1": "11", - "eu-west-1": "11", - "eu-west-2": "11", - "eu-west-3": "11", - "sa-east-1": "11", - "us-east-1": "11", - "us-east-2": "11", - "us-west-1": "11", - "us-west-2": "11", - "ap-east-1": "11", - "ap-south-1": "11", - "ap-northeast-1": "11", - "ap-northeast-2": "11", - "ap-northeast-3": "11", - "ap-southeast-1": "11", - "ap-southeast-2": "11", - "ap-southeast-3": "11", - "eu-south-1": "11", - "eu-south-2": "11", - "af-south-1": "11", - "me-south-1": "11", - "me-central-1": "11" + "ca-central-1": "12", + "eu-central-1": "12", + "eu-north-1": "12", + "eu-west-1": "12", + "eu-west-2": "12", + "eu-west-3": "12", + "sa-east-1": "12", + "us-east-1": "12", + "us-east-2": "12", + "us-west-1": "12", + "us-west-2": "12", + "ap-east-1": "12", + "ap-south-1": "12", + "ap-northeast-1": "12", + "ap-northeast-2": "12", + "ap-northeast-3": "12", + "ap-southeast-1": "12", + "ap-southeast-2": "12", + "ap-southeast-3": "12", + "eu-south-1": "12", + "eu-south-2": "12", + "af-south-1": "12", + "me-south-1": "12", + "me-central-1": "12" } } \ No newline at end of file From 02d16d4fd0fa1d36767ff0dff3a0e686101fefb3 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Mon, 15 Dec 2025 19:39:33 +0100 Subject: [PATCH 40/53] Follow-up of https://github.com/brefphp/aws-lambda-layers/pull/303 --- demo/http.php | 4 ++++ src/FpmRuntime/FpmHandler.php | 4 ---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/demo/http.php b/demo/http.php index 8b5c6b9d5..8860885f6 100644 --- a/demo/http.php +++ b/demo/http.php @@ -2,6 +2,10 @@ require __DIR__ . '/../vendor/autoload.php'; +if (isset($_GET['crash'])) { + throw new \Exception('Crash!'); +} + if (isset($_GET['sleep'])) { error_log('This is a log'); sleep(10); diff --git a/src/FpmRuntime/FpmHandler.php b/src/FpmRuntime/FpmHandler.php index d5ba0e6f3..1f91d1387 100644 --- a/src/FpmRuntime/FpmHandler.php +++ b/src/FpmRuntime/FpmHandler.php @@ -84,10 +84,6 @@ public function start(): void '--force-stderr', '--fpm-config', $this->configFile, - // Override ini settings to force disabling display_errors - // Displaying errors in the HTTP response is a security risk - '-d', - 'display_errors=0', // This setting is enabled by default for CLI invocations because it // improves performance. We disable if it for PHP-FPM manually // because it tanks performance by essentially disabling opcache From 1c9f122a3757c238116dadf14b9add0ce0b8e630 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Wed, 17 Dec 2025 10:25:30 +0100 Subject: [PATCH 41/53] Fix release notes for Redis --- docs/upgrading/v3.mdx | 10 ++++++++-- website/src/pages/news/03-bref-3.0.mdx | 12 ++++++++---- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/docs/upgrading/v3.mdx b/docs/upgrading/v3.mdx index 308bbd647..adb7e7463 100644 --- a/docs/upgrading/v3.mdx +++ b/docs/upgrading/v3.mdx @@ -347,7 +347,7 @@ The following improvements in Bref 3.0 let you clean up old configurations. The Redis PHP extension is now included in Bref layers by default. -If you were using the Redis extension from [bref/extra-php-extensions](https://github.com/brefphp/extra-php-extensions), remove it from your `serverless.yml`: +If you were using the Redis extension from [bref/extra-php-extensions](https://github.com/brefphp/extra-php-extensions), remove the layer from your `serverless.yml`: ```diff filename="serverless.yml" functions: @@ -357,7 +357,13 @@ functions: - - ${bref-extra:redis-php-84} ``` -If Redis was the only extra extension you were using, you can also uninstall the package: +And enable the extension via a `php.ini` file in your project (`php/conf.d/php.ini`): + +```diff filename="php/conf.d/php.ini" +extension=redis +``` + +If Redis was the only `bref/extra-php-extensions` extension you were using, you can uninstall the package: ```bash composer remove bref/extra-php-extensions diff --git a/website/src/pages/news/03-bref-3.0.mdx b/website/src/pages/news/03-bref-3.0.mdx index 6c6de9afa..9629c088d 100644 --- a/website/src/pages/news/03-bref-3.0.mdx +++ b/website/src/pages/news/03-bref-3.0.mdx @@ -88,9 +88,7 @@ functions: The **Redis extension** is now included in Bref layers by default. Redis is one of the most used extensions by Bref users for caching and session storage. -No more installing the extension separately, it just works! - -If you were using the Redis extension from [bref/extra-php-extensions](https://github.com/brefphp/extra-php-extensions), you can remove it from your `serverless.yml`: +If you were using the Redis extension from [bref/extra-php-extensions](https://github.com/brefphp/extra-php-extensions), remove the layer from your `serverless.yml`: ```diff filename="serverless.yml" functions: @@ -100,7 +98,13 @@ functions: - - ${bref-extra:redis-php-84} ``` -If Redis was the only extra extension you were using, you can uninstall the package entirely: +And enable the extension via a `php.ini` file in your project (`php/conf.d/php.ini`): + +```diff filename="php/conf.d/php.ini" +extension=redis +``` + +If Redis was the only `bref/extra-php-extensions` extension you were using, you can uninstall the package: ```bash composer remove bref/extra-php-extensions From 9b2e0709ec899fcc5e6a0ca8189d2dc49de7cb73 Mon Sep 17 00:00:00 2001 From: mnapoli <720328+mnapoli@users.noreply.github.com> Date: Fri, 19 Dec 2025 23:06:38 +0000 Subject: [PATCH 42/53] Update layer versions --- layers.json | 384 ++++++++++++++++++++++++++-------------------------- 1 file changed, 192 insertions(+), 192 deletions(-) diff --git a/layers.json b/layers.json index c71c28e17..24bdbfb4f 100644 --- a/layers.json +++ b/layers.json @@ -1,210 +1,210 @@ { "php-85": { - "ca-central-1": "9", - "eu-central-1": "9", - "eu-north-1": "9", - "eu-west-1": "9", - "eu-west-2": "9", - "eu-west-3": "9", - "sa-east-1": "9", - "us-east-1": "9", - "us-east-2": "9", - "us-west-1": "9", - "us-west-2": "9", - "ap-east-1": "9", - "ap-south-1": "9", - "ap-northeast-1": "9", - "ap-northeast-2": "9", - "ap-northeast-3": "9", - "ap-southeast-1": "9", - "ap-southeast-2": "9", - "ap-southeast-3": "9", - "eu-south-1": "9", - "eu-south-2": "9", - "af-south-1": "9", - "me-south-1": "9", - "me-central-1": "9" + "ca-central-1": "10", + "eu-central-1": "10", + "eu-north-1": "10", + "eu-west-1": "10", + "eu-west-2": "10", + "eu-west-3": "10", + "sa-east-1": "10", + "us-east-1": "10", + "us-east-2": "10", + "us-west-1": "10", + "us-west-2": "10", + "ap-east-1": "10", + "ap-south-1": "10", + "ap-northeast-1": "10", + "ap-northeast-2": "10", + "ap-northeast-3": "10", + "ap-southeast-1": "10", + "ap-southeast-2": "10", + "ap-southeast-3": "10", + "eu-south-1": "10", + "eu-south-2": "10", + "af-south-1": "10", + "me-south-1": "10", + "me-central-1": "10" }, "php-84": { - "ca-central-1": "12", - "eu-central-1": "12", - "eu-north-1": "12", - "eu-west-1": "12", - "eu-west-2": "12", - "eu-west-3": "12", - "sa-east-1": "12", - "us-east-1": "12", - "us-east-2": "12", - "us-west-1": "12", - "us-west-2": "12", - "ap-east-1": "12", - "ap-south-1": "12", - "ap-northeast-1": "12", - "ap-northeast-2": "12", - "ap-northeast-3": "12", - "ap-southeast-1": "12", - "ap-southeast-2": "12", - "ap-southeast-3": "12", - "eu-south-1": "12", - "eu-south-2": "12", - "af-south-1": "12", - "me-south-1": "12", - "me-central-1": "12" + "ca-central-1": "13", + "eu-central-1": "13", + "eu-north-1": "13", + "eu-west-1": "13", + "eu-west-2": "13", + "eu-west-3": "13", + "sa-east-1": "13", + "us-east-1": "13", + "us-east-2": "13", + "us-west-1": "13", + "us-west-2": "13", + "ap-east-1": "13", + "ap-south-1": "13", + "ap-northeast-1": "13", + "ap-northeast-2": "13", + "ap-northeast-3": "13", + "ap-southeast-1": "13", + "ap-southeast-2": "13", + "ap-southeast-3": "13", + "eu-south-1": "13", + "eu-south-2": "13", + "af-south-1": "13", + "me-south-1": "13", + "me-central-1": "13" }, "php-83": { - "ca-central-1": "12", - "eu-central-1": "12", - "eu-north-1": "12", - "eu-west-1": "12", - "eu-west-2": "12", - "eu-west-3": "12", - "sa-east-1": "12", - "us-east-1": "12", - "us-east-2": "12", - "us-west-1": "12", - "us-west-2": "12", - "ap-east-1": "12", - "ap-south-1": "12", - "ap-northeast-1": "12", - "ap-northeast-2": "12", - "ap-northeast-3": "12", - "ap-southeast-1": "12", - "ap-southeast-2": "12", - "ap-southeast-3": "12", - "eu-south-1": "12", - "eu-south-2": "12", - "af-south-1": "12", - "me-south-1": "12", - "me-central-1": "12" + "ca-central-1": "13", + "eu-central-1": "13", + "eu-north-1": "13", + "eu-west-1": "13", + "eu-west-2": "13", + "eu-west-3": "13", + "sa-east-1": "13", + "us-east-1": "13", + "us-east-2": "13", + "us-west-1": "13", + "us-west-2": "13", + "ap-east-1": "13", + "ap-south-1": "13", + "ap-northeast-1": "13", + "ap-northeast-2": "13", + "ap-northeast-3": "13", + "ap-southeast-1": "13", + "ap-southeast-2": "13", + "ap-southeast-3": "13", + "eu-south-1": "13", + "eu-south-2": "13", + "af-south-1": "13", + "me-south-1": "13", + "me-central-1": "13" }, "php-82": { - "ca-central-1": "12", - "eu-central-1": "12", - "eu-north-1": "12", - "eu-west-1": "12", - "eu-west-2": "12", - "eu-west-3": "12", - "sa-east-1": "12", - "us-east-1": "12", - "us-east-2": "12", - "us-west-1": "12", - "us-west-2": "12", - "ap-east-1": "12", - "ap-south-1": "12", - "ap-northeast-1": "12", - "ap-northeast-2": "12", - "ap-northeast-3": "12", - "ap-southeast-1": "12", - "ap-southeast-2": "12", - "ap-southeast-3": "12", - "eu-south-1": "12", - "eu-south-2": "12", - "af-south-1": "12", - "me-south-1": "12", - "me-central-1": "12" + "ca-central-1": "13", + "eu-central-1": "13", + "eu-north-1": "13", + "eu-west-1": "13", + "eu-west-2": "13", + "eu-west-3": "13", + "sa-east-1": "13", + "us-east-1": "13", + "us-east-2": "13", + "us-west-1": "13", + "us-west-2": "13", + "ap-east-1": "13", + "ap-south-1": "13", + "ap-northeast-1": "13", + "ap-northeast-2": "13", + "ap-northeast-3": "13", + "ap-southeast-1": "13", + "ap-southeast-2": "13", + "ap-southeast-3": "13", + "eu-south-1": "13", + "eu-south-2": "13", + "af-south-1": "13", + "me-south-1": "13", + "me-central-1": "13" }, "arm-php-85": { - "ca-central-1": "9", - "eu-central-1": "9", - "eu-north-1": "9", - "eu-west-1": "9", - "eu-west-2": "9", - "eu-west-3": "9", - "sa-east-1": "9", - "us-east-1": "9", - "us-east-2": "9", - "us-west-1": "9", - "us-west-2": "9", - "ap-east-1": "9", - "ap-south-1": "9", - "ap-northeast-1": "9", - "ap-northeast-2": "9", - "ap-northeast-3": "9", - "ap-southeast-1": "9", - "ap-southeast-2": "9", - "ap-southeast-3": "9", - "eu-south-1": "9", - "eu-south-2": "9", - "af-south-1": "9", - "me-south-1": "9", - "me-central-1": "9" + "ca-central-1": "10", + "eu-central-1": "10", + "eu-north-1": "10", + "eu-west-1": "10", + "eu-west-2": "10", + "eu-west-3": "10", + "sa-east-1": "10", + "us-east-1": "10", + "us-east-2": "10", + "us-west-1": "10", + "us-west-2": "10", + "ap-east-1": "10", + "ap-south-1": "10", + "ap-northeast-1": "10", + "ap-northeast-2": "10", + "ap-northeast-3": "10", + "ap-southeast-1": "10", + "ap-southeast-2": "10", + "ap-southeast-3": "10", + "eu-south-1": "10", + "eu-south-2": "10", + "af-south-1": "10", + "me-south-1": "10", + "me-central-1": "10" }, "arm-php-84": { - "ca-central-1": "12", - "eu-central-1": "12", - "eu-north-1": "12", - "eu-west-1": "12", - "eu-west-2": "12", - "eu-west-3": "12", - "sa-east-1": "12", - "us-east-1": "12", - "us-east-2": "12", - "us-west-1": "12", - "us-west-2": "12", - "ap-east-1": "12", - "ap-south-1": "12", - "ap-northeast-1": "12", - "ap-northeast-2": "12", - "ap-northeast-3": "12", - "ap-southeast-1": "12", - "ap-southeast-2": "12", - "ap-southeast-3": "12", - "eu-south-1": "12", - "eu-south-2": "12", - "af-south-1": "12", - "me-south-1": "12", - "me-central-1": "12" + "ca-central-1": "13", + "eu-central-1": "13", + "eu-north-1": "13", + "eu-west-1": "13", + "eu-west-2": "13", + "eu-west-3": "13", + "sa-east-1": "13", + "us-east-1": "13", + "us-east-2": "13", + "us-west-1": "13", + "us-west-2": "13", + "ap-east-1": "13", + "ap-south-1": "13", + "ap-northeast-1": "13", + "ap-northeast-2": "13", + "ap-northeast-3": "13", + "ap-southeast-1": "13", + "ap-southeast-2": "13", + "ap-southeast-3": "13", + "eu-south-1": "13", + "eu-south-2": "13", + "af-south-1": "13", + "me-south-1": "13", + "me-central-1": "13" }, "arm-php-83": { - "ca-central-1": "12", - "eu-central-1": "12", - "eu-north-1": "12", - "eu-west-1": "12", - "eu-west-2": "12", - "eu-west-3": "12", - "sa-east-1": "12", - "us-east-1": "12", - "us-east-2": "12", - "us-west-1": "12", - "us-west-2": "12", - "ap-east-1": "12", - "ap-south-1": "12", - "ap-northeast-1": "12", - "ap-northeast-2": "12", - "ap-northeast-3": "12", - "ap-southeast-1": "12", - "ap-southeast-2": "12", - "ap-southeast-3": "12", - "eu-south-1": "12", - "eu-south-2": "12", - "af-south-1": "12", - "me-south-1": "12", - "me-central-1": "12" + "ca-central-1": "13", + "eu-central-1": "13", + "eu-north-1": "13", + "eu-west-1": "13", + "eu-west-2": "13", + "eu-west-3": "13", + "sa-east-1": "13", + "us-east-1": "13", + "us-east-2": "13", + "us-west-1": "13", + "us-west-2": "13", + "ap-east-1": "13", + "ap-south-1": "13", + "ap-northeast-1": "13", + "ap-northeast-2": "13", + "ap-northeast-3": "13", + "ap-southeast-1": "13", + "ap-southeast-2": "13", + "ap-southeast-3": "13", + "eu-south-1": "13", + "eu-south-2": "13", + "af-south-1": "13", + "me-south-1": "13", + "me-central-1": "13" }, "arm-php-82": { - "ca-central-1": "12", - "eu-central-1": "12", - "eu-north-1": "12", - "eu-west-1": "12", - "eu-west-2": "12", - "eu-west-3": "12", - "sa-east-1": "12", - "us-east-1": "12", - "us-east-2": "12", - "us-west-1": "12", - "us-west-2": "12", - "ap-east-1": "12", - "ap-south-1": "12", - "ap-northeast-1": "12", - "ap-northeast-2": "12", - "ap-northeast-3": "12", - "ap-southeast-1": "12", - "ap-southeast-2": "12", - "ap-southeast-3": "12", - "eu-south-1": "12", - "eu-south-2": "12", - "af-south-1": "12", - "me-south-1": "12", - "me-central-1": "12" + "ca-central-1": "13", + "eu-central-1": "13", + "eu-north-1": "13", + "eu-west-1": "13", + "eu-west-2": "13", + "eu-west-3": "13", + "sa-east-1": "13", + "us-east-1": "13", + "us-east-2": "13", + "us-west-1": "13", + "us-west-2": "13", + "ap-east-1": "13", + "ap-south-1": "13", + "ap-northeast-1": "13", + "ap-northeast-2": "13", + "ap-northeast-3": "13", + "ap-southeast-1": "13", + "ap-southeast-2": "13", + "ap-southeast-3": "13", + "eu-south-1": "13", + "eu-south-2": "13", + "af-south-1": "13", + "me-south-1": "13", + "me-central-1": "13" } } \ No newline at end of file From f5448049aa92f8f948f8f52a2cd6a89acae5b680 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Thu, 25 Dec 2025 20:23:22 +0100 Subject: [PATCH 43/53] Improve logs --- src/bref-local | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/bref-local b/src/bref-local index 63e77d5ac..b66882e3b 100755 --- a/src/bref-local +++ b/src/bref-local @@ -22,13 +22,19 @@ $opts = getopt('', ['path:']); if (isset($opts['path'])) { if (! file_exists($opts['path'])) { - throw new Exception('The file ' . $opts['path'] . ' could not be found.'); + error_log('The file ' . $opts['path'] . ' could not be found.'); + exit(1); } $handler = $argv[array_key_last($argv)]; $data = file_get_contents($opts['path']); } +if (!$handler) { + error_log('You must provide the handler to invoke as the first argument.'); + exit(1); +} + try { $handler = Bref::getContainer()->get($handler); } catch (NotFoundExceptionInterface $e) { @@ -38,7 +44,8 @@ try { try { $event = $data ? json_decode($data, true, 512, JSON_THROW_ON_ERROR) : null; } catch (JsonException $e) { - throw new Exception('The JSON provided for the event data is invalid JSON.'); + error_log('The JSON provided for the event data is invalid JSON.'); + exit(1); } // Same configuration as the Bref runtime on Lambda From ee89bc3427822b8c6dd2bc9fd1aae9b81a136fa4 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Thu, 25 Dec 2025 20:24:20 +0100 Subject: [PATCH 44/53] Remove flag --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 766d2b878..d04ad459e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -40,7 +40,7 @@ jobs: coverage: none ini-values: expose_php=1 - name: Install dependencies - run: 'composer update ${{ matrix.dependency-version }} --no-interaction --prefer-dist --no-progress --no-security-blocking ${{ matrix.platform-reqs }}' + run: 'composer update ${{ matrix.dependency-version }} --no-interaction --prefer-dist --no-progress ${{ matrix.platform-reqs }}' - name: Execute Unit Tests run: 'vendor/bin/phpunit --testsuite small' From fa963cb2738a7bb2cbf47accd65b0d849a3c1bf5 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Fri, 9 Jan 2026 15:54:06 +0100 Subject: [PATCH 45/53] Improve upgrade guide --- docs/upgrading/v3.mdx | 86 ++++++++++++++++++++++--------------------- 1 file changed, 45 insertions(+), 41 deletions(-) diff --git a/docs/upgrading/v3.mdx b/docs/upgrading/v3.mdx index adb7e7463..1ad1998b3 100644 --- a/docs/upgrading/v3.mdx +++ b/docs/upgrading/v3.mdx @@ -37,10 +37,52 @@ Then run: composer update --with-all-dependencies ``` +## PHP extension changes + +The following improvements in Bref 3.0 let you clean up old configurations. + +### PostgreSQL extension is enabled by default + +The PostgreSQL PDO extension (`pdo_pgsql`) is now enabled by default in Bref layers. + +If you had enabled it manually via a `php.ini` file, you can remove that line: + +```diff filename="php/conf.d/php.ini" +-extension=pdo_pgsql +``` + +### Redis extension is now built-in + +The Redis PHP extension is now included in Bref layers by default. + +If you were using the Redis extension from [bref/extra-php-extensions](https://github.com/brefphp/extra-php-extensions), remove the layer from your `serverless.yml`: + +```diff filename="serverless.yml" +functions: + api: + # ... + layers: +- - ${bref-extra:redis-php-84} +``` + +And enable the extension via a `php.ini` file in your project (`php/conf.d/php.ini`): + +```diff filename="php/conf.d/php.ini" +extension=redis +``` + +If Redis was the only `bref/extra-php-extensions` extension you were using, you can uninstall the package: + +```bash +composer remove bref/extra-php-extensions +``` + ## Container image changes If you deploy using [container images](../deploy/docker.mdx), you must update your `Dockerfile`. +**If you don't have a `Dockerfile` in your project, you can skip this section.** + Since Bref container images have been merged into a single `bref/php-xx` image, the following images don't exist anymore: `bref/php-xx-fpm` and `bref/php-xx-console`. ### Option 1: Set BREF_RUNTIME in the Dockerfile @@ -111,6 +153,8 @@ If you use the `bref/php-84-fpm-dev` image for local development, update it to: + FROM bref/php-84-dev:3 ``` +You can then set `BREF_RUNTIME` environment variable in your `docker-compose.yml` file or in the `Dockerfile` directly. + ## Smaller breaking changes that might impact you The changes below should not impact the majority of users. However, if you are using any of these features, you might need to update your code. @@ -308,7 +352,7 @@ provider: BREF_AUTOLOAD_PATH: php/conf.d ``` -### Laravel users +### Laravel version compatibility If you are using Laravel with Bref, note that: @@ -339,46 +383,6 @@ This format makes logs easier to read in CloudWatch and enables powerful filteri If you prefer the old format, you can disable the formatter in your Laravel or Symfony configuration. See the [Bref Monolog documentation](https://github.com/brefphp/monolog-bridge) for details. -## Cleanup: Remove deprecated configurations - -The following improvements in Bref 3.0 let you clean up old configurations. - -### Redis extension is now built-in - -The Redis PHP extension is now included in Bref layers by default. - -If you were using the Redis extension from [bref/extra-php-extensions](https://github.com/brefphp/extra-php-extensions), remove the layer from your `serverless.yml`: - -```diff filename="serverless.yml" -functions: - api: - # ... - layers: -- - ${bref-extra:redis-php-84} -``` - -And enable the extension via a `php.ini` file in your project (`php/conf.d/php.ini`): - -```diff filename="php/conf.d/php.ini" -extension=redis -``` - -If Redis was the only `bref/extra-php-extensions` extension you were using, you can uninstall the package: - -```bash -composer remove bref/extra-php-extensions -``` - -### PostgreSQL extension is enabled by default - -The PostgreSQL PDO extension (`pdo_pgsql`) is now enabled by default in Bref layers. - -If you had enabled it manually via a `php.ini` file, you can remove that line: - -```diff filename="php/conf.d/php.ini" --extension=pdo_pgsql -``` - --- That's it! Read the [Bref 3.0 release announcement](/news/03-bref-3.0) to learn more about all the new features and improvements in this release. From e4f32af10fa7030295e634dc59a7bdcee18caa1a Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Fri, 9 Jan 2026 16:53:16 +0100 Subject: [PATCH 46/53] Improve --- website/src/pages/news/03-bref-3.0.mdx | 69 ++++++++++++------ .../src/pages/news/03/cloud-screenshot.png | Bin 0 -> 306793 bytes 2 files changed, 47 insertions(+), 22 deletions(-) create mode 100644 website/src/pages/news/03/cloud-screenshot.png diff --git a/website/src/pages/news/03-bref-3.0.mdx b/website/src/pages/news/03-bref-3.0.mdx index 9629c088d..c0f127a6b 100644 --- a/website/src/pages/news/03-bref-3.0.mdx +++ b/website/src/pages/news/03-bref-3.0.mdx @@ -1,5 +1,7 @@ import ArticleHeader from '../../components/news/ArticleHeader'; import { NextSeo } from 'next-seo'; +import Image from 'next/image'; +import cloudScreenshot from './03/cloud-screenshot.png'; + + + + ## That's it! Hope you enjoy Bref v3! @@ -193,10 +222,6 @@ Head to the docs to [**get started with Bref**](../), or check out the documenta You can also join the community [in Slack](/docs/community.md), post details about your project in [Built with Bref](https://github.com/brefphp/bref/issues/267), or share your experience online and mention [@brefphp](https://twitter.com/brefphp) on Twitter. -## One more thing - -Check out **[Bref Cloud](https://bref.sh/cloud)** for a simpler way to deploy and monitor your Bref applications! -
    What is Bref and serverless? Get started with Bref diff --git a/website/src/pages/news/03/cloud-screenshot.png b/website/src/pages/news/03/cloud-screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..1459766cdbb429434d11f589e6e6ba96a571d78e GIT binary patch literal 306793 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

    !p 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

    ROsH!0g`Ry-6UKsg@>uf0?}r6k@! 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

    2)+7vGKkfNL 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 X*z||Zi^q0>9~r5;f27^edH#O^DFnXA literal 0 HcmV?d00001 From 7f490d241b963e206a6e1708fc7cdb1d247007fe Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Tue, 13 Jan 2026 10:31:38 +0100 Subject: [PATCH 47/53] Fix #2048 --- plugin/run-console.js | 30 +++++++----------------------- 1 file changed, 7 insertions(+), 23 deletions(-) diff --git a/plugin/run-console.js b/plugin/run-console.js index 04695be3c..d25e87173 100644 --- a/plugin/run-console.js +++ b/plugin/run-console.js @@ -1,14 +1,10 @@ -const fs = require('fs'); -const path = require('path'); - /** * @param {import('./serverless').Serverless} serverless * @param {import('./serverless').CliOptions} options */ async function runConsole(serverless, options) { - const region = serverless.getProvider('aws').getRegion(); // Override CLI options for `sls invoke` - options.function = options.function || getConsoleFunction(serverless, region); + options.function = options.function || getConsoleFunction(serverless); options.type = 'RequestResponse'; options.data = options.args; options.log = true; @@ -18,36 +14,24 @@ async function runConsole(serverless, options) { /** * @param {import('./serverless').Serverless} serverless - * @param {string} region */ -function getConsoleFunction(serverless, region) { - const consoleLayerArn = getConsoleLayerArn(region); - +function getConsoleFunction(serverless) { const functions = serverless.service.functions; const consoleFunctions = []; for (const [functionName, functionDetails] of Object.entries(functions || {})) { - if (functionDetails.layers && functionDetails.layers.includes(consoleLayerArn)) { + // Check for BREF_RUNTIME environment variable (set by Bref plugin for php-XX-console runtimes) + const brefRuntime = functionDetails.environment?.BREF_RUNTIME; + if (brefRuntime === 'Bref\\ConsoleRuntime\\Main' || brefRuntime === 'console') { consoleFunctions.push(functionName); } } if (consoleFunctions.length === 0) { - throw new serverless.classes.Error('This command invokes the Lambda "console" function, but no function was found with the "console" layer'); + throw new serverless.classes.Error('This command invokes a Lambda console function, but no function was found using the console runtime (e.g. php-84-console)'); } if (consoleFunctions.length > 1) { - throw new serverless.classes.Error('More than one function contains the console layer: cannot automatically run it. Please provide a function name using the --function option.'); + throw new serverless.classes.Error('More than one function uses the console runtime: cannot automatically run it. Please provide a function name using the --function option.'); } return consoleFunctions[0]; } -/** - * @param {string} region - * @returns {string} - */ -function getConsoleLayerArn(region) { - const json = fs.readFileSync(path.join(__dirname, '../layers.json')); - const layers = JSON.parse(json.toString()); - const version = layers.console[region]; - return `arn:aws:lambda:${region}:873528684822:layer:console:${version}`; -} - module.exports = {runConsole}; From b5441e9a283b630dcd46f6d32dd5903388fe5c88 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Tue, 13 Jan 2026 10:35:25 +0100 Subject: [PATCH 48/53] Fix --- plugin/run-console.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugin/run-console.js b/plugin/run-console.js index d25e87173..009af4fc9 100644 --- a/plugin/run-console.js +++ b/plugin/run-console.js @@ -20,7 +20,7 @@ function getConsoleFunction(serverless) { const consoleFunctions = []; for (const [functionName, functionDetails] of Object.entries(functions || {})) { // Check for BREF_RUNTIME environment variable (set by Bref plugin for php-XX-console runtimes) - const brefRuntime = functionDetails.environment?.BREF_RUNTIME; + const brefRuntime = functionDetails.environment && functionDetails.environment.BREF_RUNTIME; if (brefRuntime === 'Bref\\ConsoleRuntime\\Main' || brefRuntime === 'console') { consoleFunctions.push(functionName); } From 2576aa83c4ac43fd3f7ab261b3334f2154cedd30 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Thu, 15 Jan 2026 10:20:56 +0100 Subject: [PATCH 49/53] Upgrade dependencies --- composer.json | 14 +++++++------- src/FpmRuntime/FpmHandler.php | 2 +- src/Runtime/LambdaRuntime.php | 6 ++---- tests/Event/Http/CommonHttpTest.php | 2 +- tests/FpmRuntime/FpmHandlerTest.php | 4 ++-- tests/Runtime/LambdaRuntimeTest.php | 4 ++-- tests/RuntimeTestCase.php | 4 ++-- 7 files changed, 17 insertions(+), 19 deletions(-) diff --git a/composer.json b/composer.json index 5c497701b..68080bb2e 100644 --- a/composer.json +++ b/composer.json @@ -29,20 +29,20 @@ "psr/http-message": "^1.0|^2.0", "psr/http-server-handler": "^1.0", "riverline/multipart-parser": "^2.1.2", - "symfony/process": "^5.4|^6.4|^7.0|^8.0" + "symfony/process": "^6.4|^7.0|^8.0" }, "require-dev": { "async-aws/core": "^1.0", - "async-aws/lambda": "^1.0", + "async-aws/lambda": "^2.0", "aws/aws-sdk-php": "^3.172", "bref/secrets-loader": "^1.0", - "dms/phpunit-arraysubset-asserts": "^0.4", + "dms/phpunit-arraysubset-asserts": "^0.5", "doctrine/coding-standard": "^8.0", "guzzlehttp/guzzle": "^7.5", - "phpstan/phpstan": "^1.10.26", - "phpunit/phpunit": "^9.6.10", - "symfony/console": "^5.4|^6.4|^7.0|^8.0", - "symfony/yaml": "^5.4|^6.4|^7.0|^8.0" + "phpstan/phpstan": "^2", + "phpunit/phpunit": "^10", + "symfony/console": "^6.4|^7.0|^8.0", + "symfony/yaml": "^6.4|^7.0|^8.0" }, "scripts": { "test": [ diff --git a/src/FpmRuntime/FpmHandler.php b/src/FpmRuntime/FpmHandler.php index 1f91d1387..6931b9caa 100644 --- a/src/FpmRuntime/FpmHandler.php +++ b/src/FpmRuntime/FpmHandler.php @@ -43,7 +43,7 @@ final class FpmHandler extends HttpHandler */ private const SIGTERM = 15; - private ?Client $client; + private ?Client $client = null; private UnixDomainSocket $connection; private string $handler; private string $configFile; diff --git a/src/Runtime/LambdaRuntime.php b/src/Runtime/LambdaRuntime.php index e08219809..4b9412ca7 100755 --- a/src/Runtime/LambdaRuntime.php +++ b/src/Runtime/LambdaRuntime.php @@ -35,10 +35,8 @@ */ final class LambdaRuntime { - /** @var resource|CurlHandle|null */ - private $curlHandleNext; - /** @var resource|CurlHandle|null */ - private $curlHandleResult; + private ?CurlHandle $curlHandleNext = null; + private ?CurlHandle $curlHandleResult = null; private string $apiUrl; private Invoker $invoker; private string $layer; diff --git a/tests/Event/Http/CommonHttpTest.php b/tests/Event/Http/CommonHttpTest.php index 1c4805901..e283076a2 100644 --- a/tests/Event/Http/CommonHttpTest.php +++ b/tests/Event/Http/CommonHttpTest.php @@ -232,7 +232,7 @@ public function test POST request with form data and content type(int $v ]); } - public function provideHttpMethodsWithRequestBodySupport(): array + public static function provideHttpMethodsWithRequestBodySupport(): array { return [ 'POST v1' => [ diff --git a/tests/FpmRuntime/FpmHandlerTest.php b/tests/FpmRuntime/FpmHandlerTest.php index b332a4bc0..1ae4a32bf 100644 --- a/tests/FpmRuntime/FpmHandlerTest.php +++ b/tests/FpmRuntime/FpmHandlerTest.php @@ -480,7 +480,7 @@ public function test POST request with form data and content type(int $v ]); } - public function provideHttpMethodsWithRequestBodySupport(): array + public static function provideHttpMethodsWithRequestBodySupport(): array { return [ 'POST v1' => [ @@ -1133,7 +1133,7 @@ public function test response with status code(int $expectedStatusCode) self::assertEquals($expectedStatusCode, $statusCode); } - public function provideStatusCodes(): array + public static function provideStatusCodes(): array { return [[200], [301], [302], [400], [401], [403], [404], [500], [504]]; } diff --git a/tests/Runtime/LambdaRuntimeTest.php b/tests/Runtime/LambdaRuntimeTest.php index aecc7d89a..ba568b78c 100644 --- a/tests/Runtime/LambdaRuntimeTest.php +++ b/tests/Runtime/LambdaRuntimeTest.php @@ -428,7 +428,7 @@ public function afterInvoke(mixed ...$params): void // The error response was already sent, it contains the handler error $this->assertInvocationErrorResult('Exception', 'Invocation error'); // The logs should contain both the handler error and the afterInvoke error - $this->assertStringContainsString('Invoke Error {"errorType":"Exception","errorMessage":"Invocation error","stack":', $this->getActualOutput()); - $this->assertStringContainsString('Invoke Error {"errorType":"Exception","errorMessage":"This is an exception in afterInvoke","stack":', $this->getActualOutput()); + $this->assertStringContainsString('Invoke Error {"errorType":"Exception","errorMessage":"Invocation error","stack":', $this->output()); + $this->assertStringContainsString('Invoke Error {"errorType":"Exception","errorMessage":"This is an exception in afterInvoke","stack":', $this->output()); } } diff --git a/tests/RuntimeTestCase.php b/tests/RuntimeTestCase.php index 9cf2602b0..de9469709 100644 --- a/tests/RuntimeTestCase.php +++ b/tests/RuntimeTestCase.php @@ -80,7 +80,7 @@ protected function assertInvocationErrorResult(string $errorClass, string $error protected function assertErrorInLogs(string $errorClass, string $errorMessage): void { // Decode the logs from stdout - $stdout = $this->getActualOutput(); + $stdout = $this->output(); [$requestId, $message, $json] = explode("\t", $stdout); @@ -108,7 +108,7 @@ protected function assertErrorInLogs(string $errorClass, string $errorMessage): protected function assertPreviousErrorsInLogs(array $previousErrors): void { // Decode the logs from stdout - $stdout = $this->getActualOutput(); + $stdout = $this->output(); [, , $json] = explode("\t", $stdout); From 65168a7d51bc18791cbaf4462d7b614c630090f8 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Thu, 15 Jan 2026 11:06:54 +0100 Subject: [PATCH 50/53] Fixes --- .gitignore | 2 +- phpunit.xml | 16 +++++++++------- tests/Event/Http/CommonHttpTest.php | 2 +- tests/Event/Http/HttpRequestEventTest.php | 4 ++-- tests/FpmRuntime/FpmHandlerTest.php | 2 +- 5 files changed, 14 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index 6f891b3ba..672c7d39e 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,6 @@ /website/node_modules/ .DS_Store /.serverless/ -.phpunit.result.cache +.phpunit.cache node_modules/ package-lock.json diff --git a/phpunit.xml b/phpunit.xml index f8a3f2026..e8e4f4094 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -1,21 +1,23 @@ - - - - src - - + ./tests/ ./tests/Sam ./tests/Fixtures + ./tests/HttpRequestProxyTest.php + ./tests/Event/Http/CommonHttpTest.php ./tests/Sam - + + + + src + + diff --git a/tests/Event/Http/CommonHttpTest.php b/tests/Event/Http/CommonHttpTest.php index e283076a2..c3940b5fa 100644 --- a/tests/Event/Http/CommonHttpTest.php +++ b/tests/Event/Http/CommonHttpTest.php @@ -7,7 +7,7 @@ abstract class CommonHttpTest extends TestCase implements HttpRequestProxyTest { - public function provide API Gateway versions(): array + public static function provide API Gateway versions(): array { return [ 'v1' => [1], diff --git a/tests/Event/Http/HttpRequestEventTest.php b/tests/Event/Http/HttpRequestEventTest.php index 925a324f9..bf9868450 100644 --- a/tests/Event/Http/HttpRequestEventTest.php +++ b/tests/Event/Http/HttpRequestEventTest.php @@ -168,7 +168,7 @@ public function test query string to array(string $query, array $expectedOut $this->assertEquals($expectedOutput, $result); } - public function provide query strings(): iterable + public static function provide query strings(): iterable { yield ['', []]; @@ -248,7 +248,7 @@ public function test query string will be parsed correctly(array $expected self::assertSame($normalizedQs, $event->getQueryString()); } - public function provide query strings for event(): array + public static function provide query strings for event(): array { return [ [['foo' => 'bar'], 'foo=bar', 'foo=bar'], diff --git a/tests/FpmRuntime/FpmHandlerTest.php b/tests/FpmRuntime/FpmHandlerTest.php index 1ae4a32bf..ae79a40a5 100644 --- a/tests/FpmRuntime/FpmHandlerTest.php +++ b/tests/FpmRuntime/FpmHandlerTest.php @@ -30,7 +30,7 @@ public function tearDown(): void ob_end_clean(); } - public function provide API Gateway versions(): array + public static function provide API Gateway versions(): array { return [ 'v1' => [1], From ea476399d68327fdafb64af25cdd35b9f10ce0b2 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Thu, 15 Jan 2026 15:41:31 +0100 Subject: [PATCH 51/53] Fix PHPUnit 10.1 compatibility MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Require phpunit ^10.1 (for element support) - Remove manual ob_start/ob_end_clean (conflicts with PHPUnit output buffering) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .claude/settings.local.json | 8 ++++++++ composer.json | 2 +- tests/FpmRuntime/FpmHandlerLoadBalancerTest.php | 2 -- tests/FpmRuntime/FpmHandlerTest.php | 2 -- tests/RuntimeTestCase.php | 2 -- 5 files changed, 9 insertions(+), 7 deletions(-) create mode 100644 .claude/settings.local.json diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 000000000..57aa488c0 --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,8 @@ +{ + "permissions": { + "allow": [ + "Bash(docker run:*)", + "Bash(vendor/bin/phpunit:*)" + ] + } +} diff --git a/composer.json b/composer.json index 68080bb2e..725a6786a 100644 --- a/composer.json +++ b/composer.json @@ -40,7 +40,7 @@ "doctrine/coding-standard": "^8.0", "guzzlehttp/guzzle": "^7.5", "phpstan/phpstan": "^2", - "phpunit/phpunit": "^10", + "phpunit/phpunit": "^10.1", "symfony/console": "^6.4|^7.0|^8.0", "symfony/yaml": "^6.4|^7.0|^8.0" }, diff --git a/tests/FpmRuntime/FpmHandlerLoadBalancerTest.php b/tests/FpmRuntime/FpmHandlerLoadBalancerTest.php index a41701783..49d6f7fc0 100644 --- a/tests/FpmRuntime/FpmHandlerLoadBalancerTest.php +++ b/tests/FpmRuntime/FpmHandlerLoadBalancerTest.php @@ -15,14 +15,12 @@ public function setUp(): void { parent::setUp(); - ob_start(); $this->fakeContext = new Context('abc', time(), 'abc', 'abc'); } public function tearDown(): void { $this->fpm->stop(); - ob_end_clean(); } /** diff --git a/tests/FpmRuntime/FpmHandlerTest.php b/tests/FpmRuntime/FpmHandlerTest.php index ae79a40a5..b59a524cf 100644 --- a/tests/FpmRuntime/FpmHandlerTest.php +++ b/tests/FpmRuntime/FpmHandlerTest.php @@ -20,14 +20,12 @@ public function setUp(): void { parent::setUp(); - ob_start(); $this->fakeContext = new Context('abc', time(), 'abc', 'abc'); } public function tearDown(): void { $this->fpm->stop(); - ob_end_clean(); } public static function provide API Gateway versions(): array diff --git a/tests/RuntimeTestCase.php b/tests/RuntimeTestCase.php index de9469709..51db0a194 100644 --- a/tests/RuntimeTestCase.php +++ b/tests/RuntimeTestCase.php @@ -15,7 +15,6 @@ abstract class RuntimeTestCase extends TestCase protected function setUp(): void { Bref::reset(); - ob_start(); Server::start(); putenv('AWS_LAMBDA_RUNTIME_API=localhost:8126'); } @@ -23,7 +22,6 @@ protected function setUp(): void protected function tearDown(): void { Server::stop(); - ob_end_clean(); } protected function givenAnEvent(mixed $event): void From d7644fe4eefb9a6d3895a277dd07739e4e206dd7 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Thu, 15 Jan 2026 16:57:34 +0100 Subject: [PATCH 52/53] Ignore --- .claude/settings.local.json | 8 -------- .gitignore | 1 + 2 files changed, 1 insertion(+), 8 deletions(-) delete mode 100644 .claude/settings.local.json diff --git a/.claude/settings.local.json b/.claude/settings.local.json deleted file mode 100644 index 57aa488c0..000000000 --- a/.claude/settings.local.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "permissions": { - "allow": [ - "Bash(docker run:*)", - "Bash(vendor/bin/phpunit:*)" - ] - } -} diff --git a/.gitignore b/.gitignore index 672c7d39e..d6c95a099 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ .phpunit.cache node_modules/ package-lock.json +.claude From 451f1f5e7fbc6318abaf4fd9f976db1f5f388e08 Mon Sep 17 00:00:00 2001 From: Matthieu Napoli Date: Thu, 15 Jan 2026 16:59:24 +0100 Subject: [PATCH 53/53] Restore ob_start/ob_end_clean to prevent test timeouts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- tests/FpmRuntime/FpmHandlerLoadBalancerTest.php | 2 ++ tests/FpmRuntime/FpmHandlerTest.php | 2 ++ tests/RuntimeTestCase.php | 2 ++ 3 files changed, 6 insertions(+) diff --git a/tests/FpmRuntime/FpmHandlerLoadBalancerTest.php b/tests/FpmRuntime/FpmHandlerLoadBalancerTest.php index 49d6f7fc0..a41701783 100644 --- a/tests/FpmRuntime/FpmHandlerLoadBalancerTest.php +++ b/tests/FpmRuntime/FpmHandlerLoadBalancerTest.php @@ -15,12 +15,14 @@ public function setUp(): void { parent::setUp(); + ob_start(); $this->fakeContext = new Context('abc', time(), 'abc', 'abc'); } public function tearDown(): void { $this->fpm->stop(); + ob_end_clean(); } /** diff --git a/tests/FpmRuntime/FpmHandlerTest.php b/tests/FpmRuntime/FpmHandlerTest.php index b59a524cf..ae79a40a5 100644 --- a/tests/FpmRuntime/FpmHandlerTest.php +++ b/tests/FpmRuntime/FpmHandlerTest.php @@ -20,12 +20,14 @@ public function setUp(): void { parent::setUp(); + ob_start(); $this->fakeContext = new Context('abc', time(), 'abc', 'abc'); } public function tearDown(): void { $this->fpm->stop(); + ob_end_clean(); } public static function provide API Gateway versions(): array diff --git a/tests/RuntimeTestCase.php b/tests/RuntimeTestCase.php index 51db0a194..de9469709 100644 --- a/tests/RuntimeTestCase.php +++ b/tests/RuntimeTestCase.php @@ -15,6 +15,7 @@ abstract class RuntimeTestCase extends TestCase protected function setUp(): void { Bref::reset(); + ob_start(); Server::start(); putenv('AWS_LAMBDA_RUNTIME_API=localhost:8126'); } @@ -22,6 +23,7 @@ protected function setUp(): void protected function tearDown(): void { Server::stop(); + ob_end_clean(); } protected function givenAnEvent(mixed $event): void