[RESUELTO] Mysqli y PDO en PHP 5.6 y 7.4 con TuxCare ELS en AlmaLinux 9
Contexto
Administro un VPS con AlmaLinux 9 y panel de control WHM/cPanel. Entre los sitios que alojo tengo aplicaciones legacy que fueron desarrolladas hace años y que, por diversas razones (presupuesto, complejidad de migración, dependencias específicas), no han sido actualizadas a versiones modernas de PHP.
El problema es que AlmaLinux 9 — y los repositorios estándar de cPanel/EasyApache 4 — ya no ofrecen soporte para PHP 5.6 ni PHP 7.4. Ambas versiones llegaron al fin de su vida útil (EOL) hace tiempo.
Para resolverlo, opté por instalar TuxCare ELS (Extended Lifecycle Support), un servicio de pago que permite seguir usando versiones de PHP fuera de soporte oficial, proporcionando parches de seguridad y paquetes actualizados. Una vez instalado y configurado, pude instalar alt-php56 y alt-php74 en el servidor.
Todo parecía en orden… hasta que las aplicaciones que dependían de base de datos empezaron a fallar.
El problema
Al revisar los logs de Apache (/usr/local/apache/logs/error_log), encontré estos errores recurrentes:
PHP Fatal error: Class 'mysqli' not found in /home/.../conexion.php on line 11
PHP Fatal error: Class 'PDO' not found in /home/.../script/pregunta_respuesta.php on line 13
PHP Warning: Module 'mysqlnd' already loaded in Unknown on line 0
Las extensiones de base de datos simplemente no estaban disponibles. Las aplicaciones no podían conectarse a MySQL/MariaDB porque PHP no tenía cargadas las extensiones mysqli ni pdo_mysql.
Diagnóstico
Lo primero que verifiqué fue si los paquetes estaban instalados:
bash
yum install alt-php74-mysqlnd alt-php74-pdo
Respuesta del sistema:
Package alt-php74-mysqlnd-7.4.33-54.el9.x86_64 is already installed.
Package alt-php74-pdo-7.4.33-54.el9.x86_64 is already installed.
Nothing to do.
Los paquetes sí estaban instalados. El problema era otro.
Verifiqué qué módulos estaba cargando realmente el binario de PHP 7.4:
bash
/opt/alt/php74/usr/bin/php -m | grep -iE "mysqli|pdo|mysqlnd"
Resultado:
PDO
Solo PDO base, sin mysqli ni pdo_mysql. Luego revisé qué archivos .ini estaban activos:
bash
ls /opt/alt/php74/etc/php.d/
Solo había un default.ini. Y al listar los .ini disponibles para extensiones de base de datos:
bash
ls /opt/alt/php74/etc/php.d.all/ | grep -iE "mysql|pdo"
Aparecieron nd_mysqli.ini y nd_pdo_mysql.ini — archivos listos para usar, pero en un directorio «de bodega» (php.d.all/) que no es escaneado automáticamente.
Adicionalmente, en el default.ini que sí se cargaba, todas las extensiones estaban comentadas:
ini
;extension=mysqlnd.so
;extension=nd_mysqli.so
;extension=nd_pdo_mysql.so
;extension=pdo.so
Conclusión: TuxCare instala los paquetes pero no activa las extensiones automáticamente.
La solución para PHP 7.4
Con el diagnóstico claro, la solución fue directa:
bash
# 1. Copiar los .ini al directorio activo
cp /opt/alt/php74/etc/php.d.all/nd_mysqli.ini /opt/alt/php74/etc/php.d/
cp /opt/alt/php74/etc/php.d.all/nd_pdo_mysql.ini /opt/alt/php74/etc/php.d/
# 2. Habilitar mysqlnd.so y pdo.so en el default.ini (estaban comentados)
sed -i 's/^;extension=mysqlnd.so/extension=mysqlnd.so/' /opt/alt/php74/link/conf/default.ini
sed -i 's/^;extension=pdo.so/extension=pdo.so/' /opt/alt/php74/link/conf/default.ini
# 3. Verificar
/opt/alt/php74/usr/bin/php -m | grep -iE "mysqli|pdo|mysqlnd"
Resultado esperado:
mysqli
mysqlnd
PDO
pdo_mysql
Finalmente, reinicié Apache:
bash
systemctl restart httpd
Las aplicaciones volvieron a funcionar inmediatamente.
Nota sobre los drivers
nd_: Las extensiones se llamannd_mysqliynd_pdo_mysql(prefijo nd de native driver). Son las versiones que utilizanmysqlndcomo driver base en lugar delibmysqlclient, y son las recomendadas para el stackalt-phpde TuxCare/CloudLinux.
El caso de PHP 5.6
PHP 5.6 tenía un historial diferente: alguien había intentado solucionar el problema antes que yo y lo había hecho de forma funcional pero no estandarizada. Las extensiones estaban declaradas directamente en el php.ini principal:
bash
grep -iE "mysqli|pdo" /opt/alt/php56/etc/php.ini
extension=pdo.so
extension=pdo_mysql.so
extension=mysqli.so
Esto funciona, pero tiene dos problemas:
- Usa
mysqli.soypdo_mysql.soen lugar de las versionesnd_(native driver), que son las recomendadas. - Modificar el
php.iniprincipal es frágil: una actualización de TuxCare puede sobreescribirlo y el problema regresa sin previo aviso.
Además, había un symlink roto en el directorio activo:
bash
ls -la /opt/alt/php56/etc/php.d/
# mysqli.ini -> /opt/alt/php56/etc/php.d.all/mysqli.ini (no existe)
La solución fue limpiar y estandarizar:
bash
# 1. Eliminar las líneas manuales del php.ini
sed -i '/^extension=pdo\.so/d' /opt/alt/php56/etc/php.ini
sed -i '/^extension=pdo_mysql\.so/d' /opt/alt/php56/etc/php.ini
sed -i '/^extension=mysqli\.so/d' /opt/alt/php56/etc/php.ini
# 2. Eliminar el symlink roto y copiar los .ini correctos
rm /opt/alt/php56/etc/php.d/mysqli.ini
cp /opt/alt/php56/etc/php.d.all/nd_mysqli.ini /opt/alt/php56/etc/php.d/
cp /opt/alt/php56/etc/php.d.all/nd_pdo_mysql.ini /opt/alt/php56/etc/php.d/
# 3. Habilitar pdo en link/conf
sed -i 's/^;extension=pdo.so/extension=pdo.so/' /opt/alt/php56/link/conf/default.ini
# 4. Verificar
/opt/alt/php56/usr/bin/php -m | grep -iE "mysqli|pdo|mysqlnd"
Resultado:
mysqli
mysqlnd
PDO
pdo_mysql
Reinicio de Apache y todo en orden.
Lección aprendida
TuxCare ELS instala los paquetes de PHP, pero no activa las extensiones automáticamente. Los archivos .ini de cada extensión quedan disponibles en el directorio php.d.all/, que funciona como un repositorio de configuraciones disponibles, pero no es escaneado por PHP. Es responsabilidad del administrador copiar los .ini necesarios al directorio activo php.d/.
Este comportamiento difiere de lo que muchos esperamos al instalar un paquete en Linux, donde generalmente la extensión queda activa de inmediato. En el ecosistema alt-php de CloudLinux/TuxCare, hay un paso adicional manual.
Resumen de rutas importantes
| Elemento | PHP 7.4 | PHP 5.6 |
|---|---|---|
| Binario PHP | /opt/alt/php74/usr/bin/php | /opt/alt/php56/usr/bin/php |
| php.ini principal | /opt/alt/php74/etc/php.ini | /opt/alt/php56/etc/php.ini |
| .ini activos | /opt/alt/php74/etc/php.d/ | /opt/alt/php56/etc/php.d/ |
| .ini disponibles | /opt/alt/php74/etc/php.d.all/ | /opt/alt/php56/etc/php.d.all/ |
| default.ini (link) | /opt/alt/php74/link/conf/default.ini | /opt/alt/php56/link/conf/default.ini |
| Módulos (.so) | /opt/alt/php74/usr/lib64/php/modules/ | /opt/alt/php56/usr/lib64/php/modules/ |
Espero que este post le sea útil a quienes estén en una situación similar: aplicaciones legacy que no pueden migrarse fácilmente a versiones modernas de PHP, corriendo en servidores actuales con AlmaLinux 9 y WHM/cPanel.