FrankenPHP has the ability to embed the source code and assets of PHP applications in a static, self-contained binary.
Thanks to this feature, PHP applications can be distributed as standalone binaries that include the application itself, the PHP interpreter and Caddy, a production-level web server.
Learn more about this feature in the presentation made by Kévin at SymfonyCon.
Before creating the self-contained binary be sure that your app is ready for embedding.
For instance you likely want to:
.git
or tests to reduce the size of your final binaryFor instance, for a Symfony app, you can use the following commands:
# Export the project to get rid of .git/, etc
mkdir $TMPDIR/my-prepared-app
git archive HEAD | tar -x -C $TMPDIR/my-prepared-app
cd $TMPDIR/my-prepared-app
# Set proper environment variables
echo APP_ENV=prod > .env.local
echo APP_DEBUG=0 >> .env.local
# Remove the tests
rm -Rf tests/
# Install the dependencies
composer install --ignore-platform-reqs --no-dev -a
# Optimize .env
composer dump-env prod
The easiest way to create a Linux binary is to use the Docker-based builder we provide.
Create a file named static-build.Dockerfile
in the repository of your prepared app:
FROM --platform=linux/amd64 dunglas/frankenphp:static-builder
# Copy your app
WORKDIR /go/src/app/dist/app
COPY . .
# Build the static binary, be sure to select only the PHP extensions you want
WORKDIR /go/src/app/
RUN EMBED=dist/app/ \
PHP_EXTENSIONS=ctype,iconv,pdo_sqlite \
./build-static.sh
Build:
docker build -t static-app -f static-build.Dockerfile .
Extract the binary
docker cp $(docker create --name static-app-tmp static-app):/go/src/app/dist/frankenphp-linux-x86_64 my-app ; docker rm static-app-tmp
The resulting binary is the file named my-app
in the current directory.
If you don't want to use Docker, or want to build a macOS binary, use the shell script we provide:
git clone https://github.com/dunglas/frankenphp
cd frankenphp
EMBED=/path/to/your/app \
PHP_EXTENSIONS=ctype,iconv,pdo_sqlite \
./build-static.sh
The resulting binary is the file named frankenphp-<os>-<arch>
in the dist/
directory.
This is it! The my-app
file (or dist/frankenphp-<os>-<arch>
on other OSes) contains your self-contained app!
To start the web app run:
./my-app php-server
If your app contains a worker script, start the worker with something like:
./my-app php-server --worker public/index.php
To enable HTTPS (a Let's Encrypt certificate is automatically created), HTTP/2 and HTTP/3, specify the domain name to use:
./my-app php-server --domain localhost
You can also run the PHP CLI scripts embedded in your binary:
./my-app php-cli bin/console
Read the static build documentation to see how to customize the binary (extensions, PHP version...).
The created binary isn't compressed. To reduce the size of the file before sending it, you can compress it.
We recommend xz
.