Files
2026-03-03 11:41:21 +01:00

134 lines
5.3 KiB
Markdown

# Compilar desde fuentes
Este documento explica cómo crear un binario de FrankenPHP que cargará PHP como una biblioteca dinámica.
Esta es la forma recomendada.
Alternativamente, también se pueden crear [compilaciones estáticas y mayormente estáticas](static.md).
## Instalar PHP
FrankenPHP es compatible con PHP 8.2 y versiones superiores.
### Con Homebrew (Linux y Mac)
La forma más sencilla de instalar una versión de libphp compatible con FrankenPHP es usar los paquetes ZTS proporcionados por [Homebrew PHP](https://github.com/shivammathur/homebrew-php).
Primero, si no lo ha hecho ya, instale [Homebrew](https://brew.sh).
Luego, instale la variante ZTS de PHP, Brotli (opcional, para soporte de compresión) y watcher (opcional, para detección de cambios en archivos):
```console
brew install shivammathur/php/php-zts brotli watcher
brew link --overwrite --force shivammathur/php/php-zts
```
### Compilando PHP
Alternativamente, puede compilar PHP desde las fuentes con las opciones necesarias para FrankenPHP siguiendo estos pasos.
Primero, [obtenga las fuentes de PHP](https://www.php.net/downloads.php) y extráigalas:
```console
tar xf php-*
cd php-*/
```
Luego, ejecute el script `configure` con las opciones necesarias para su plataforma.
Las siguientes banderas de `./configure` son obligatorias, pero puede agregar otras, por ejemplo, para compilar extensiones o características adicionales.
#### Linux
```console
./configure \
--enable-embed \
--enable-zts \
--disable-zend-signals \
--enable-zend-max-execution-timers
```
#### Mac
Use el gestor de paquetes [Homebrew](https://brew.sh/) para instalar las dependencias requeridas y opcionales:
```console
brew install libiconv bison brotli re2c pkg-config watcher
echo 'export PATH="/opt/homebrew/opt/bison/bin:$PATH"' >> ~/.zshrc
```
Luego ejecute el script de configuración:
```console
./configure \
--enable-embed \
--enable-zts \
--disable-zend-signals \
--with-iconv=/opt/homebrew/opt/libiconv/
```
#### Compilar PHP
Finalmente, compile e instale PHP:
```console
make -j"$(getconf _NPROCESSORS_ONLN)"
sudo make install
```
## Instalar dependencias opcionales
Algunas características de FrankenPHP dependen de dependencias opcionales del sistema que deben instalarse.
Alternativamente, estas características pueden deshabilitarse pasando etiquetas de compilación al compilador Go.
| Característica | Dependencia | Etiqueta de compilación para deshabilitarla |
| ----------------------------------- | ------------------------------------------------------------------------------------------------------------- | -------------------------------------------- |
| Compresión Brotli | [Brotli](https://github.com/google/brotli) | nobrotli |
| Reiniciar workers al cambiar archivos | [Watcher C](https://github.com/e-dant/watcher/tree/release/watcher-c) | nowatcher |
| [Mercure](mercure.md) | [Biblioteca Mercure Go](https://pkg.go.dev/github.com/dunglas/mercure) (instalada automáticamente, licencia AGPL) | nomercure |
## Compilar la aplicación Go
Ahora puede construir el binario final.
### Usando xcaddy
La forma recomendada es usar [xcaddy](https://github.com/caddyserver/xcaddy) para compilar FrankenPHP.
`xcaddy` también permite agregar fácilmente [módulos personalizados de Caddy](https://caddyserver.com/docs/modules/) y extensiones de FrankenPHP:
```console
CGO_ENABLED=1 \
XCADDY_GO_BUILD_FLAGS="-ldflags='-w -s' -tags=nobadger,nomysql,nopgx" \
CGO_CFLAGS=$(php-config --includes) \
CGO_LDFLAGS="$(php-config --ldflags) $(php-config --libs)" \
xcaddy build \
--output frankenphp \
--with github.com/dunglas/frankenphp/caddy \
--with github.com/dunglas/mercure/caddy \
--with github.com/dunglas/vulcain/caddy \
--with github.com/dunglas/caddy-cbrotli
# Agregue módulos adicionales de Caddy y extensiones de FrankenPHP aquí
# opcionalmente, si desea compilar desde sus fuentes de frankenphp:
# --with github.com/dunglas/frankenphp=$(pwd) \
# --with github.com/dunglas/frankenphp/caddy=$(pwd)/caddy
```
> [!TIP]
>
> Si está usando musl libc (predeterminado en Alpine Linux) y Symfony,
> es posible que deba aumentar el tamaño de pila predeterminado.
> De lo contrario, podría obtener errores como `PHP Fatal error: Maximum call stack size of 83360 bytes reached during compilation. Try splitting expression`
>
> Para hacerlo, cambie la variable de entorno `XCADDY_GO_BUILD_FLAGS` a algo como:
> `XCADDY_GO_BUILD_FLAGS=$'-ldflags "-w -s -extldflags \'-Wl,-z,stack-size=0x80000\'"'`
> (cambie el valor del tamaño de pila según las necesidades de su aplicación).
### Sin xcaddy
Alternativamente, es posible compilar FrankenPHP sin `xcaddy` usando directamente el comando `go`:
```console
curl -L https://github.com/php/frankenphp/archive/refs/heads/main.tar.gz | tar xz
cd frankenphp-main/caddy/frankenphp
CGO_CFLAGS=$(php-config --includes) CGO_LDFLAGS="$(php-config --ldflags) $(php-config --libs)" go build -tags=nobadger,nomysql,nopgx
```