open-southeners / laravel-vapor-response-compression
Add server-side response compression with a range of different algorithms (Gzip, brotli, deflate...)
Installs: 65 643
Dependents: 0
Suggesters: 0
Security: 0
Stars: 13
Watchers: 1
Forks: 1
Open Issues: 0
Requires
- php: ^7.2 || ^8.0
- ext-zlib: ^7.2 || ^8.0
Requires (Dev)
- larastan/larastan: ^2.0
- orchestra/testbench: ^8.0
- phpstan/phpstan: ^1.0
- phpunit/phpunit: ^10.0
README
Add server-side response compression with a range of different algorithms (Gzip, brotli, deflate...)
Why use this package?
The reason why is because AWS hard limit its API Gateway service to 10MB (at the date of writing this), and by hard we mean that there's no way you can increase this limitation.
Note: Thought CloudFlare is a good solution for the end user, it doesn't solve this issue as CloudFlare does this between the server and the client, so the response already passed through AWS (API Gateway).
Read more here: https://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html#http-api-quotas
Or on our blog article: https://opensoutheners.com/how-to-prevent-large-responses-to-trigger-502-errors
Getting started
composer require open-southeners/laravel-vapor-response-compression
Then publish the configuration file defaults into your application's config folder:
php artisan vendor:publish --tag=response-compression
Then add the following to you app/Http/Kernel.php
as a global middleware:
Note: Remember this is different in older versions of Laravel, Laravel 9 should look like the following.
/** * The application's global HTTP middleware stack. * * These middleware are run during every request to your application. * * @var array<string, array<int, class-string|string>> */ protected $middleware = [ // ... \OpenSoutheners\LaravelVaporResponseCompression\ResponseCompression::class, ];
Configuration
If you already have this config/response-compression.php
file, you can skip this step, otherwise please use the following artisan command first:
php artisan vendor:publish --tag=response-compression
Note: As for smaller responses this threshold will prevent to compress the response if it doesn't reach an specific number of bytes. We encourage you to configure this and not leave it as ±0 bytes otherwise response will be always compressed.
This configuration is defaulted to 10000 bytes, you may customise this as your application demands.
Setting up Brotli extension in Vapor
First of all, this will require you to use Docker containers on your Vapor environments if you're not familiar with them, you can still use this extension as it uses the first client requested algorithm available at server side.
👉 Read more about using containers in Vapor here
Anyway, in case you want to proceed, add this to your environment Dockerfile(s), please use comments as references only:
# FROM laravelphp/vapor:php81 RUN apk add --no-cache brotli # COPY . /var/task
And ensure your project depends on vdechenaux/brotli.
Alternative Brotli setup
Another alternative is to use: https://github.com/kjdev/php-ext-brotli
TODO: Setup instructions for Vapor/Dockerfile
Credits
- To @jryd_13 for writing the article that gave me this idea