Saltar al contenido

Requisitos Previos

  • Docker Desktop 4.x o superior

Introducción

FrankenPHP es un servidor web moderno escrito en Go que integra el runtime de PHP directamente. A diferencia de configuraciones tradicionales como Apache o Nginx con PHP-FPM, FrankenPHP ofrece mejor rendimiento y una configuración más simplificada.

Estructura del Proyecto

Primero, crea un nuevo directorio para tu proyecto:

mkdir mi-proyecto-frankenphp
cd mi-proyecto-frankenphp

Paso 1: Configuración de Docker

Dockerfile

Crea un archivo Dockerfile:

Explicación del Dockerfile

Vamos a analizar cada parte del Dockerfile para entender su función:

  1. Imagen Base

    FROM dunglas/frankenphp:1.4.2-php8.4-alpine
  • Utilizamos FrankenPHP 1.4.2 que es la versión más reciente y estable

  • Incluye PHP 8.4 preinstalado

  • Basada en Alpine Linux, que es una distribución ligera ideal para contenedores

  • Alpine reduce significativamente el tamaño de la imagen final

  1. Dependencias del Sistema

    RUN apk add --no-cache \ unzip \ git
  • apk es el gestor de paquetes de Alpine Linux

  • --no-cache evita almacenar archivos temporales, reduciendo el tamaño de la imagen

  • unzip es necesario para que Composer pueda descomprimir paquetes

  • git permite a Composer clonar repositorios de paquetes

  1. Instalación de Composer

    COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
  • Usa la técnica de multi-stage building para optimizar el tamaño

  • Obtiene la última versión estable de Composer

  • Solo copia el binario de Composer, no toda la imagen

  1. Extensiones PHP

    RUN install-php-extensions \ pdo_mysql \ zip \ opcache \ intl
  • install-php-extensions es un script que simplifica la instalación de extensiones PHP

  • pdo_mysql: necesario para conectar con bases de datos MySQL

  • zip: requerido para manipular archivos comprimidos (usado por Composer)

  • opcache: mejora el rendimiento cacheando el bytecode de PHP

  • intl: proporciona soporte para internacionalización

  1. Configuración de PHP y Directorio de Trabajo

    COPY php.ini /usr/local/etc/php/conf.d/app.ini WORKDIR /app COPY . /app
  • Copia tu configuración personalizada de PHP

  • La ubica en conf.d para que se combine con la configuración base

  • Establece /app como el directorio de trabajo

  • Copia todos los archivos del proyecto al contenedor

  1. Puerto y Permisos

    EXPOSE 80 RUN chmod -R 777 /app
  • EXPOSE 80: documenta que el contenedor usa el puerto 80 (HTTP)

  • Los permisos 777 son útiles para desarrollo pero NO recomendados para producción

  • En producción, deberías usar permisos más restrictivos

Consideraciones de Seguridad

  • Los permisos 777 son demasiado permisivos para producción

  • En producción, considera usar permisos más restrictivos (como 755 para directorios y 644 para archivos)

  • Asegúrate de que el usuario www-data tenga los permisos necesarios

Optimizaciones Posibles

  • Usar una versión específica de las extensiones PHP

  • Añadir más extensiones según las necesidades del proyecto

  • Configurar OPcache para mejor rendimiento

  • Ajustar los permisos según el entorno

docker-compose.yml

Crea un archivo docker-compose.yml:

Explicación de las Variables de Entorno

  • PHP_MEMORY_LIMIT=256M: Establece el límite de memoria para PHP.

  • APP_ENV=development: Define el entorno como desarrollo.

  • SERVER_NAME=:80: Configura FrankenPHP para escuchar en todas las interfaces en el puerto 80.

  • FRANKENPHP_CONFIG: Especifica la configuración del worker de FrankenPHP.

Paso 2: Configuración de PHP

Crea un archivo php.ini:

Paso 3: Archivo de Prueba

Crea un archivo index.php en el directorio public de tu proyecto:

Paso 4: Construir y Ejecutar

# Construir la imagen 
docker-compose build --no-cache 

# Iniciar el contenedor 
docker-compose up -d 

# Verificar que el contenedor está corriendo 
docker-compose ps

Paso 5: Trabajando con Composer

Una vez que el contenedor esté en funcionamiento, puedes usar Composer de varias formas:

Iniciar un Nuevo Proyecto

docker-compose exec app composer init

Instalar Dependencias

docker-compose exec app composer require monolog/monolog

Instalar Dependencias de Desarrollo

docker-compose exec app composer require --dev phpunit/phpunit

Optimizar para Producción

docker-compose exec app composer install --no-dev --optimize-autoloader

Verificación y Pruebas

  1. Accede a http://localhost:8000 en tu navegador

  2. Deberías ver la página de phpinfo() mostrando la configuración de PHP 8.4

Solución de Problemas Comunes

Problemas de Permisos

Si encuentras errores de permisos:

docker-compose exec app chown -R www-data:www-data /app

Puerto en Uso

Si el puerto 8000 está ocupado, modifica el puerto en docker-compose.yml:

ports: - "8080:80" # O cualquier otro puerto disponible

Problemas con Composer

Si encuentras errores de memoria con Composer:

docker-compose exec app php -d memory_limit=-1 /usr/bin/composer require paquete-grande

Próximos Pasos

  1. Framework PHP

    • Instalar Laravel, Symfony u otro framework de tu elección

    • Configurar el documento root según el framework

  2. Base de Datos

    • Añadir servicios adicionales como MySQL o PostgreSQL

    • Configurar la conexión a la base de datos

  3. Producción

    • Configurar HTTPS

    • Optimizar la configuración de PHP

    • Ajustar los workers de FrankenPHP

Recursos Adicionales

Conclusión

Esta configuración te proporciona un entorno de desarrollo moderno y eficiente con FrankenPHP, PHP 8.4 y Composer. La combinación de estas tecnologías te permite desarrollar aplicaciones PHP de manera rápida y eficiente, aprovechando las últimas características de PHP y el rendimiento optimizado de FrankenPHP.

Rutas de aprendizaje