FrankenPHP tiene la capacidad de incrustar el código fuente y los activos de aplicaciones PHP en un binario estático y autónomo.
Gracias a esta característica, las aplicaciones PHP pueden distribuirse como binarios autónomos que incluyen la aplicación en sí, el intérprete de PHP y Caddy, un servidor web de nivel de producción.
Obtenga más información sobre esta característica en la presentación realizada por Kévin en SymfonyCon 2023.
Para incrustar aplicaciones Laravel, lea esta entrada específica de documentación.
Antes de crear el binario autónomo, asegúrese de que su aplicación esté lista para ser incrustada.
Por ejemplo, probablemente querrá:
- Instalar las dependencias de producción de la aplicación
- Volcar el autoload
- Activar el modo de producción de su aplicación (si lo hay)
- Eliminar archivos innecesarios como
.gito pruebas para reducir el tamaño de su binario final
Por ejemplo, para una aplicación Symfony, puede usar los siguientes comandos:
# Exportar el proyecto para deshacerse de .git/, etc.
mkdir $TMPDIR/my-prepared-app
git archive HEAD | tar -x -C $TMPDIR/my-prepared-app
cd $TMPDIR/my-prepared-app
# Establecer las variables de entorno adecuadas
echo APP_ENV=prod > .env.local
echo APP_DEBUG=0 >> .env.local
# Eliminar las pruebas y otros archivos innecesarios para ahorrar espacio
# Alternativamente, agregue estos archivos con el atributo export-ignore en su archivo .gitattributes
rm -Rf tests/
# Instalar las dependencias
composer install --ignore-platform-reqs --no-dev -a
# Optimizar .env
composer dump-env prodPara personalizar la configuración, puede colocar un archivo Caddyfile así como un archivo php.ini
en el directorio principal de la aplicación a incrustar ($TMPDIR/my-prepared-app en el ejemplo anterior).
La forma más fácil de crear un binario para Linux es usar el constructor basado en Docker que proporcionamos.
-
Cree un archivo llamado
static-build.Dockerfileen el repositorio de su aplicación:FROM --platform=linux/amd64 dunglas/frankenphp:static-builder-gnu # Si tiene la intención de ejecutar el binario en sistemas musl-libc, use static-builder-musl en su lugar # Copie su aplicación WORKDIR /go/src/app/dist/app COPY . . # Construya el binario estático WORKDIR /go/src/app/ RUN EMBED=dist/app/ ./build-static.sh
[!CAUTION]
Algunos archivos
.dockerignore(por ejemplo, el.dockerignorepredeterminado de Symfony Docker) ignorarán el directoriovendor/y los archivos.env. Asegúrese de ajustar o eliminar el archivo.dockerignoreantes de la construcción. -
Construya:
docker build -t static-app -f static-build.Dockerfile . -
Extraiga el binario:
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
El binario resultante es el archivo llamado my-app en el directorio actual.
Si no desea usar Docker o desea construir un binario para macOS, use el script de shell que proporcionamos:
git clone https://github.com/php/frankenphp
cd frankenphp
EMBED=/path/to/your/app ./build-static.shEl binario resultante es el archivo llamado frankenphp-<os>-<arch> en el directorio dist/.
¡Listo! El archivo my-app (o dist/frankenphp-<os>-<arch> en otros sistemas operativos) contiene su aplicación autónoma.
Para iniciar la aplicación web, ejecute:
./my-app php-serverSi su aplicación contiene un script worker, inicie el worker con algo como:
./my-app php-server --worker public/index.phpPara habilitar HTTPS (se crea automáticamente un certificado de Let's Encrypt), HTTP/2 y HTTP/3, especifique el nombre de dominio a usar:
./my-app php-server --domain localhostTambién puede ejecutar los scripts CLI de PHP incrustados en su binario:
./my-app php-cli bin/consolePor defecto, el script construirá las extensiones requeridas por el archivo composer.json de su proyecto, si existe.
Si el archivo composer.json no existe, se construirán las extensiones predeterminadas, como se documenta en la entrada de compilaciones estáticas.
Para personalizar las extensiones, use la variable de entorno PHP_EXTENSIONS.
Lea la documentación de compilación estática para ver cómo personalizar el binario (extensiones, versión de PHP, etc.).
En Linux, el binario creado se comprime usando UPX.
En Mac, para reducir el tamaño del archivo antes de enviarlo, puede comprimirlo.
Recomendamos xz.