Recientemente, tuve un problema curioso al conectar a un servidor MySQL desde PHP en un servicio nuevo que estaba configurando, resulta que al colocar localhost como host en la conexión esta fallaba, si colocaba 127.0.0.1 funcionaba perfecto, descartado un problema de permisos y de configuración del archivo hosts, descartando problemas con IPv6, descartando SELinux y una larga lista de cosas, el error no parecía tener sentido.
Finalmente, encuentre que el error lo había provocado yo mismo, resulta que por requerimientos de lo que estaba haciendo, había modificado la ruta del socket en archivo my.cnf y, por tanto, no estaba donde PHP lo buscaba al conectarse como localhost, no me pregunten por qué funcionaba al poner 127.0.0.1
La cuestión es que el Socket por defecto es:
/var/lib/mysql/mysql.sock
Y yo lo había remplazado por:
/tmp/mysql/mysql.sock
Resulta que PHP lo busca automáticamente en su ruta habitual, el hecho de que al ejecutar mysql desde consola tuviera que especificarle el parámetro -h debió darme una pista
Solución
Solución al conectarse desde consola
Para solucionar primero el tema de la consola, lo primero es modificar el archivo /etc/my.cnf.d/client.cnf y que quedar mas o menos así:
[client] socket=/tmp/mysql/mysql.sock host=localhost [client-mariadb] socket=/tmp/mysql/mysql.sock host=localhost
Por supuesto tendrán que ajustar la ruta del socket a la que necesiten, en mi caso es /tmp/mysql/mysql.sock, en su caso puede ser diferente.
Solución al conectarse desde PHP
Para solucionar el problema desde PHP va en la misma linea de lo anterior, deben modificar el archivo php.ini y modificar lo siguiente:
mysqli.default_socket = /tmp/mysql/mysql.sock pdo_mysql.default_socket = /tmp/mysql/mysql.sock
Si el archivo tiene el valor mysql.default_socket deben modificarlo
mysql.default_socket = /tmp/mysql/mysql.sock
Digo si lo tienen, en mi caso no existía, nuevamente tendrán que ajustar la ruta del socket a la que necesiten.
Nota aparte
En el caso que utilicen PHP con PHP-FPM como servicio y hayan movido el socket a /tmp, deben modificar el valor PrivateTmp para PHP pueda acceder directamente a /tmp y no quede restringido a /var/tmp/systemd-private-…
Dependiendo de la versión de PHP-FPM, para este ejemplo php74-php-fpm, simplemente ejecutan Para deshabilitar PrivateTmp:
sed -i 's/PrivateTmp=true/PrivateTmp=false/g' /usr/lib/systemd/system/php74-php-fpm.service
Recargamos y reiniciamos
systemctl daemon-reload systemctl restart php74-php-fpm
Conclusión
Rara vez debemos cambiar o modificar la ruta del socket, sin embargo, si lo hacemos puede dar lugar a que otras aplicaciones fallen, tanto el cliente MySQL como las librerías de conexión de los lenguajes, en este caso PHP, aunque por lo menos la solución es bastante sencilla.
Administrador de Sistemas, Programador, Docente y ahora resulta que también Blogger (peor es ser tictoker). Más de 20 años de experiencia en computación atendiendo nabos y resolviendo problemas, los cuales si no fuera por estos nabos, no habrían ocurrido en primer lugar. Escribo más que nada sobre tecnología y herramientas en general, además de algunos artículos con opiniones tan subjetivas como irrelevantes, así que si no te gustan, mejor madura y superalo.