[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 llaman nd_mysqli y nd_pdo_mysql (prefijo nd de native driver). Son las versiones que utilizan mysqlnd como driver base en lugar de libmysqlclient, y son las recomendadas para el stack alt-php de 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:

  1. Usa mysqli.so y pdo_mysql.so en lugar de las versiones nd_ (native driver), que son las recomendadas.
  2. Modificar el php.ini principal 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

ElementoPHP 7.4PHP 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.

Artículo anterior

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.