Situación actual: PHP2Shell. Dos vulnerabilidades críticas de PHP (CVSS 9.2) permiten ejecutar código malicioso sin autenticación. Parches desde el 21/10/2026.Qué hacer ahora →

Desarrollar PHP en local: Docker, DDEV y otras opciones

Para el desarrollo local en PHP existen el servidor web integrado, las imágenes oficiales de Docker y herramientas como DDEV. Lo importante es que en local se ejecute la misma versión de PHP que en producción.

Actualizado 5 min de lecturaConocimiento de PHP

En resumen: para desarrollar PHP en local hay tres vías habituales: el servidor web integrado (php -S) para pruebas rápidas, las imágenes oficiales de PHP en Docker para entornos reproducibles y herramientas como DDEV, que crean entornos de proyecto ya preparados para WordPress, TYPO3, Shopware o Laravel. Lo decisivo es menos la herramienta que la coincidencia: en local debería ejecutarse la misma versión de PHP con las mismas extensiones que en producción. Para la seguridad, sin embargo, cuenta siempre el entorno de ejecución del servidor.

¿Por qué un entorno de desarrollo propio?

Hacer cambios directamente en el servidor de producción es arriesgado: cada error de teclado es visible de inmediato para los clientes y los archivos de prueba se quedan olvidados con facilidad. Un entorno local separa el probar del funcionamiento real. Es además el lugar donde primero se prueban las nuevas versiones de PHP y las actualizaciones de seguridad.

Para la dirección y la responsabilidad de TI, la pregunta no es si existe un entorno de desarrollo, sino si se corresponde con el sistema en producción. Un entorno local con PHP 8.4 mientras en producción sigue 8.1 oculta los problemas en lugar de mostrarlos. Lo mismo vale para la versión de la base de datos, el servidor web y extensiones como intl, gd o pdo_mysql: con que falte una sola extensión, un error puede notarse solo en producción.

Las opciones de un vistazo

Opción Adecuada para Ventajas Límites
Servidor integrado php -S pruebas breves, scripts pequeños sin instalar más software no sustituye a Nginx ni a Apache, no apto para redes públicas
Imagen oficial de Docker equipos, entornos reproducibles versión fijable mediante etiqueta, cercana al funcionamiento en contenedores hay que construir uno mismo la configuración y la interacción de varios contenedores
DDEV proyectos de CMS y frameworks tipos de proyecto ya preparados, base de datos y servidor web incluidos exige Docker, convenciones propias
PHP instalado en local desarrolladores individuales rápido, directo difícil mantener en paralelo las versiones de varios proyectos

El servidor web integrado

Desde PHP 5.4, la línea de comandos incluye un pequeño servidor web. Se inicia en el directorio actual o, con -t, en otro directorio de documentos:

php -S localhost:8000 -t public/

Opcionalmente se pasa un script de enrutamiento que se ejecuta primero en cada petición. El manual es claro en su valoración: el servidor debe apoyar el desarrollo, no es un servidor web completo y no debe usarse en una red pública. Por eso, enlácelo a localhost y no a 0.0.0.0; de lo contrario, puede ser accesible desde la wifi de la empresa o del hotel. Más sobre la línea de comandos en PHP en la línea de comandos.

Docker: imágenes oficiales de PHP

Las imágenes oficiales existen en varias variantes: cli para la línea de comandos, apache con Apache y mod_php, fpm para el funcionamiento detrás de Nginx u otro proxy, además de variantes Alpine para imágenes pequeñas. Un inicio rápido con Apache:

docker run --rm -p 8080:80 -v "$PWD":/var/www/html php:8.4-apache

Las imágenes incluyen las plantillas php.ini-development y php.ini-production en el directorio $PHP_INI_DIR. En local conviene la plantilla de desarrollo, porque muestra los errores. Para producción, la documentación de la imagen recomienda expresamente la plantilla de producción. Las extensiones se instalan con los scripts auxiliares incluidos docker-php-ext-configure, docker-php-ext-install y docker-php-ext-enable. Cómo funcionan las etiquetas y los digests lo explica Imágenes oficiales de PHP en Docker.

DDEV: entornos listos para CMS y frameworks

DDEV se basa en Docker y configura para un proyecto el servidor web, PHP, la base de datos y los servicios auxiliares. Las guías de inicio rápido siguen casi siempre el mismo patrón:

ddev config --project-type=wordpress --docroot=web
ddev start
ddev composer install
ddev launch

Como tipos de proyecto, DDEV conoce, entre otros, wordpress, typo3, shopware6, laravel, symfony, drupal11, magento2 y el tipo general php. La versión de PHP se fija en .ddev/config.yaml; según la documentación, son posibles versiones de la 5.6 a la 8.5, y la predeterminada es la 8.4:

# .ddev/config.yaml (extracto)
php_version: "8.3"
webserver_type: nginx-fpm   # alternativa: apache-fpm

Así, el entorno local se corresponde con la versión de producción, aunque esta todavía no sea la más reciente.

Desarrollo local, estado de parches y PHP2Shell

Tras PHP2Shell, varios proveedores de plataformas señalaron un error de razonamiento típico. Según su boletín, Vercel subraya que no basta con actualizar el entorno de desarrollo local, el código de la aplicación o los plugins; lo decisivo es el entorno de ejecución de PHP que realmente sirve las páginas. Tener en local PHP 8.4.27 no protege al servidor con 8.4.26.

A la inversa, el entorno de desarrollo trae riesgos propios que pueden pasar a producción:

  1. ini de desarrollo en producción: display_errors está activado en php.ini-development. Si este archivo llega al servidor, los visitantes ven rutas y mensajes de error. Véase Desactivar la salida de errores en producción.
  2. Archivos de prueba olvidados: los archivos phpinfo(), los volcados de base de datos o los archivos .env con credenciales no pertenecen al despliegue.
  3. Servidores de desarrollo abiertos: php -S o contenedores con puertos publicados en equipos conectados a la red.
  4. Imágenes obsoletas: las imágenes locales no se actualizan solas; tras una versión de seguridad de PHP, también el entorno de desarrollo debe reconstruirse para que las pruebas se ejecuten con la versión corregida.
Consejo

Fije la versión de PHP en un solo lugar, por ejemplo en el Dockerfile o en .ddev/config.yaml, y cámbiela en las actualizaciones junto con la configuración del servidor.

¿Cómo ayuda PHP SOS en concreto?

En el contrato de mantenimiento de seguridad nos aseguramos de que desarrollo y operación coincidan:

  • Contraste: comparamos la versión de PHP y las extensiones de los entornos de desarrollo, de prueba y de producción.
  • Proceso de actualización: las nuevas versiones de PHP se aplican primero en el entorno de prueba y después en producción, en ambos casos con reinicio.
  • Revisar el despliegue: vigilamos que no lleguen al servidor ni ini de desarrollo, ni archivos de prueba, ni credenciales.
  • Documentación: usted sabe en todo momento qué versión se ejecuta dónde.

Preguntas frecuentes

¿Puedo usar el servidor web integrado de PHP de forma pública?

No. El manual de PHP dice expresamente que el servidor iniciado con php -S sirve para el desarrollo y no debe usarse en una red pública. Para la operación se usa PHP-FPM con Nginx o Apache.

¿Qué es DDEV?

DDEV es una herramienta basada en Docker que crea entornos de desarrollo ya preparados para proyectos PHP. Conoce tipos de proyecto para WordPress, TYPO3, Shopware 6, Laravel, Drupal y otros sistemas.

¿Basta con actualizar la versión local de PHP?

No. Frente a vulnerabilidades como PHP2Shell cuenta el entorno de ejecución de PHP que realmente sirve las páginas, es decir, el del servidor. Pero el entorno local debería tener la misma versión para que las pruebas sean significativas.

¿Qué php.ini uso en local?

En local conviene php.ini-development, porque muestra los errores. En producción debe usarse php.ini-production. Las imágenes oficiales de Docker incluyen ambas plantillas.

Fuentes

Contacto inmediato

Cada hora cuenta. Escríbanos ahora.

Describa brevemente el sistema, la versión de PHP y lo que ha observado. Nos pondremos en contacto, aclararemos la situación y trabajaremos en remoto hasta que el incidente quede cerrado y documentado.

Ayuda inmediata