---
title: "Compilar desde fuentes"
description: "Este documento explica cómo crear un binario de FrankenPHP que cargará PHP como una biblioteca dinámica. Esta es la forma recomendada."
sidebar:
  label: "Compilar desde las fuentes"
  order: 5
---
Alternativamente, también se pueden crear [compilaciones estáticas y mayormente estáticas](/es/docs/static).

## 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](/es/docs/mercure)                 | [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

```

<div class="fp-callout" data-callout="tip">
<p class="fp-callout-title">Consejo</p>

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).

</div>

### 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
```
