Configuring PHP
php.ini
PHP will read its configuration from:
/opt/bref/etc/php/php.ini(PHP’s official production configuration)/opt/bref/etc/php/conf.d/bref.ini(Bref’s optimizations for Lambda)
These files cannot be customized.
Customizing php.ini
You can create your own php.ini to customize PHP’s configuration:
- create a
php/conf.d/subdirectory in your project - create a
php.inifile inside that directory (the name of the file does not matter, it must have an.iniextension)
PHP will automatically include any *.ini file found in php/conf.d/ in your project.
Customizing php.ini using a custom path
If you want PHP to scan a different directory than php/conf.d/ in your project, you can add it with the PHP_INI_SCAN_DIR environment variable:
provider:
environment:
PHP_INI_SCAN_DIR: '/opt/bref/etc/php/conf.d:/var/task/my/different/dir'Keep /opt/bref/etc/php/conf.d in the value so that Bref continues to load its configuration.
Setting only your custom directory would prevent /opt/bref/etc/php/conf.d/bref.ini from
loading.
Learn how to declare environment variables by reading the Environment Variables guide.
Customizing php.ini in extra layers
If you are using Lambda layers, for example to use custom PHP extensions, you can override the default php.ini by placing your own configuration file in /opt/bref/etc/php/conf.d/.
Make sure to give a unique name to your .ini file to avoid any collision with other layers.
Extensions
Bref strives to include the most common PHP extensions. If a major PHP extension is missing please open an issue to discuss it.
Built-in extensions
The following extensions are installed and enabled by default in Bref runtimes:
- Core
- bcmath
- ctype
- curl
- date
- dom
- exif
- fileinfo
- filter
- ftp
- gettext
- hash
- iconv
- json
- libxml
- mbstring
- mysqli
- mysqlnd
- opcache
- openssl
- pcntl
- pcre
- PDO
- pdo_sqlite
- pdo_mysql
- pdo_pgsql
- Phar
- posix
- readline
- Reflection
- session
- SimpleXML
- sodium
- sockets
- SPL
- sqlite3
- tokenizer
- xml
- xmlreader
- xmlwriter
- xsl
- zlib
Extensions installed but disabled by default
The following extensions are installed in Bref runtimes, but disabled by default:
- intl - Internationalization extension (referred to as Intl) is a wrapper for ICU library, enabling PHP programmers to perform various locale-aware operations.
- APCu - APCu is APC stripped of opcode caching.
- Redis - A PHP extension for interfacing with Redis.
- soap - 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), for example:
extension=intl
extension=apcu
extension=redis
extension=soapExtra extensions
Due to space limitations in AWS Lambda, Bref runtimes cannot include every possible PHP extension. These additional PHP extensions are provided by the brefphp/extra-php-extensions project, as separate AWS Lambda layers and Docker images.
The most popular extra extensions are:
- gd - image processing with the GD library
- imagick - image manipulation with ImageMagick
- gmp - GNU Multiple Precision arithmetic
- mongodb - MongoDB driver
- sqlsrv - Microsoft SQL Server driver (pdo_sqlsrv)
- memcached - Memcached client
- rdkafka - Apache Kafka client (librdkafka)
- amqp - RabbitMQ and AMQP client
- grpc and protobuf - gRPC and Protocol Buffers
- ldap - LDAP directory access
- imap - IMAP mail access
- xdebug - debugging and profiling
- pcov - code coverage
- blackfire , tideways , datadog , newrelic - APM and profiling agents
And many more: see the full list of extra extensions . Contributions to add more PHP extensions are welcome.
Bref extra extensions are contributed by the community. Feel free to contribute to the repository or get in touch for Bref support if you want to ensure a specific extension is available and maintained.
Using extra extensions with Lambda layers
Install the bref/extra-php-extensions package, add its plugin to serverless.yml and reference the layer of each extension you need:
composer require bref/extra-php-extensionsplugins:
- ./vendor/bref/bref
- ./vendor/bref/extra-php-extensions
functions:
api:
handler: public/index.php
runtime: php-84-fpm
layers:
- ${bref-extra:gd-php-84}
- ${bref-extra:imagick-php-84}Keep in mind that AWS Lambda allows at most 5 layers per function, and that extra extensions are not available for ARM (arm64) yet.
Using extra extensions with Docker
If you deploy using container images, each extra extension is also available as a Docker image (bref/extra-gd-php-84, bref/extra-imagick-php-84, etc.) that you can copy into your own image. Read the “Extra PHP extensions” section of the Docker guide.
Custom extensions
It is also possible to provide your own extensions via custom AWS Lambda layers .
This guide is really raw, feel free to contribute to improve it.
To create your custom layer, you will need to:
- compile the extension (and any required libraries) in the same environment as AWS Lambda and Bref
- include the compiled extension (and required libraries) in a layer
- upload the layer to AWS Lambda
- include the layer in your project
- enable the extension in a custom
php.ini
To compile the extension, Bref provides the bref/build-php-* Docker images. Here is an example with Blackfire:
FROM bref/build-php-84:3
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-84.so"
# Build the final image from the amazon image that is close to the production environment
FROM public.ecr.aws/lambda/provided:al2023
# Copy things we installed to the final image
COPY --from=0 /tmp/blackfire.so /opt/bref-extra/blackfire.soThe .so extension file can then be retrieved in /opt/bref-extra/blackfire.so.
If you installed system libraries, you may also need to copy them to the public.ecr.aws/lambda/provided:al2023
image.
See brefphp/extra-php-extensions for more examples.
Custom vendor path
Bref automatically requires vendor dependencies from the default vendor/autoload.php path.
If your Composer dependencies are installed elsewhere, you can customize that path via the BREF_AUTOLOAD_PATH environment variable.
provider:
# ...
environment:
BREF_AUTOLOAD_PATH: '/var/task/foo-bar/vendor/autoload.php'The path must start with /var/task, which is the directory where projects are installed on AWS Lambda.