Configuración de selectores de PHP para ejecutar múltiples versiones por directorio

En hosting compartido es habitual mantener clientes con aplicaciones que requieren versiones distintas de PHP. Este artículo explica, de forma técnica y práctica, cómo implementar selectores de PHP que permitan ejecutar múltiples versiones por directorio —tanto en entornos Apache como Nginx—, con ejemplos reales, consideraciones de seguridad y recomendaciones para WordPress y herramientas como Composer.

Por qué necesitas selectores de PHP por directorio

No todas las aplicaciones funcionan con la misma versión de PHP. Mantener una única versión obliga a actualizar código o sacrificar compatibilidad. Los selectores de PHP permiten:

  • Migrar gradualmente: ejecutar versiones antiguas en subdirectorios mientras actualizas el código.
  • Aislar aplicaciones: un WordPress legacy puede usar PHP 7.2 mientras otro sitio usa PHP 8.1.
  • Probar compatibilidad: desplegar pruebas A/B con distintas versiones sin cambiar el servidor entero.

Modelos comunes para implementar selectores en hosting compartido

En hosting compartido no siempre hay control total del servidor, por eso los proveedores ofrecen mecanismos y hay alternativas técnicas que funcionan con los permisos disponibles.

1) Handlers y .htaccess (Apache)

Muchos paneles (MultiPHP, cPanel, Plesk) usan .htaccess para cambiar el handler que procesa PHP. Las técnicas más empleadas son:

  • AddHandler / SetHandler con mod_fcgid o ProxyPassMatch para redirigir a diferentes sockets de PHP-FPM.
  • Marcadores de versión almacenados en archivos como .php-version que el proveedor interpreta.

Ejemplo práctico con PHP-FPM y Apache usando unix socket (requiere mod_proxy_fcgi y permisos del proveedor):

<FilesMatch "\.php$">
  SetHandler "proxy:unix:/run/php/php7.4-fpm.sock|fcgi://localhost/"
</FilesMatch>

Para cambiar a PHP 8.1, se apunta al socket correspondiente: /run/php/php8.1-fpm.sock. En hosting compartido este cambio normalmente lo habilita el proveedor; como usuario puedes tener una interfaz que genere ese .htaccess.

2) Selectores por archivo de control (.user.ini o .php-version)

Algunos proveedores permiten colocar un archivo en el directorio raíz que indica la versión deseada (por ejemplo .php-version). El mecanismo interno del provider lee ese archivo y reconfigura el handler. Esto es transparente para el usuario y es la opción más sencilla cuando está disponible.

3) Nginx: mapas y ubicaciones con fastcgi_pass

En entornos con Nginx se utiliza la directiva fastcgi_pass para enviar peticiones a distintos sockets. Un ejemplo de configuración a nivel servidor (requiere acceso a la configuración del host):

map $uri $php_fpm_socket {
  default /run/php/php8.1-fpm.sock;
  ~^/legacy/ /run/php/php7.4-fpm.sock;
}

location ~ \.php$ {
  fastcgi_pass unix:$php_fpm_socket;
  include fastcgi_params;
}

Esta técnica permite enrutar por patrón de URL o por virtual host. En hosting compartido solo es posible si el proveedor lo soporta o mediante contenedores gestionados.

Configuración práctica paso a paso

Abajo indico flujos de trabajo para tres escenarios frecuentes: cuando el proveedor ofrece selector, cuando solo hay .htaccess, y cuando tienes control de PHP-FPM/Nginx.

Escenario A — Proveedor con selector (panel)

  • Desde el panel, busca «Selector PHP» o «MultiPHP Manager».
  • Selecciona la carpeta o dominio y elige la versión requerida.
  • Verifica con un phpinfo() en ese directorio.

Ventaja: sin configuración manual. Limitación: dependes de las versiones que ofrezca el proveedor.

Escenario B — Apache + .htaccess (sin panel)

  • Confirma con el soporte técnico qué handlers están disponibles y sus sockets.
  • En el directorio crea o edita .htaccess con el SetHandler adecuado (ejemplo arriba).
  • Comprueba errores en los logs de Apache y en los logs de PHP-FPM (si accesibles).

Escenario C — Control de servidor (NGINX/PHP-FPM)

  • Crear pools de PHP-FPM para cada versión, cada uno con su unix socket o puerto TCP.
  • Configurar Nginx para mapear rutas o virtual hosts a sockets distintos (ejemplo arriba).
  • Reiniciar servicios y testear con phpinfo() o comandos CLI.

Consideraciones de seguridad y rendimiento

  • Separación de procesos: usar sockets por pool reduce la superficie de errores y permite limitar recursos (pm.max_children, pm.memory_limit).
  • Permisos: asegúrate que los sockets tienen permisos correctos y que el usuario del pool no expone archivos sensibles.
  • Actualizaciones: versiones EOL (fin de soporte) deben evitarse por riesgos de seguridad. Consulta el calendario oficial de soporte de PHP.
  • Cabeceras y caching: al cambiar handler, revisa configuración de OPCache y cabeceras para evitar servir bytecode incompatible.

Compatibilidad con WordPress y herramientas comunes

WordPress generalmente funciona mejor en versiones modernas de PHP. Para entornos mixtos:

  • Plugin compatibilidad: prueba en staging antes de mover producción.
  • Composer & WP-CLI: si ejecutas comandos desde CLI en hosting compartido, el PHP CLI puede ser distinto al PHP FPM. Usa rutas absolutas al binario deseado, por ejemplo: /usr/bin/php7.4 composer install.
  • Extensiones: verifica que la versión seleccionada tiene las extensiones necesarias (pdo_mysql, gd, intl, etc.).

Diagnóstico y resolución de problemas

Si el selector no funciona:

  • Verifica permisos y sintaxis del .htaccess con apachectl configtest (si tienes acceso) o pide al soporte revisar logs.
  • Revisa que el socket o puerto exista y esté activo: ss -l | grep php o ps aux | grep php-fpm.
  • Comprueba errores PHP en los logs del sitio y activa temporalmente el registro de errores (no en producción sin protección).

Buenas prácticas operativas

  • Mantén un inventario de sitios y sus versiones PHP para planificar upgrades.
  • Automatiza pruebas unitarias y de integración para detectar incompatibilidades antes de cambiar la versión.
  • Usa certificados TLS actuales y configura HSTS; para detalles de certificados consulta Let’s Encrypt.
  • Aplica controles de seguridad recomendados por OWASP para aplicaciones PHP: OWASP.

Recapitulación y recomendaciones finales

Implementar selectores de PHP por directorio en hosting compartido es una solución práctica para compatibilidad y migraciones. El método exacto depende del control que tengas sobre el servidor y de las herramientas que ofrezca tu proveedor. Cuando tengas control del stack, la combinación Nginx + PHP-FPM con pools y mapas ofrece la mayor flexibilidad; en entornos gestionados, utiliza el selector del panel o .htaccess proporcionado.

Para minimizar riesgos: planifica actualizaciones, evita versiones EOL, valida extensiones y realiza pruebas en staging. Documenta configuraciones por proyecto y, siempre que sea posible, solicita al proveedor logs y acceso a sockets para diagnóstico. Con una configuración ordenada podrás mantener múltiples versiones de PHP por directorio sin sacrificar seguridad ni rendimiento.

Referencias útiles: documentación oficial de PHP-FPM y la guía de NGINX sobre FastCGI.