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.

Leave a Reply

Your email address will not be published. Required fields are marked *

Discover more from Alvaro De León

Subscribe now to keep reading and get access to the full archive.

Continue reading