2009-11-30 25 views
26

Mi código funcionaba perfectamente ayer y hoy de repente simplemente no quiero conectarme a mi base de datos. No modifiqué ninguna configuración en él ni en el código, y tampoco actualicé ningún software. Todo lo que hago es la siguiente:Error al conectar con MySQL usando PHP/PDO

new PDO('mysql:host=localhost;port=3306;dbname=test', 'username', 'password');

y me sale un mensaje de excepción agradable decir esto:

Warning: PDO::__construct(): [2002] No such file or directory (trying to connect via unix:///tmp/mysql.sock) in ...

La cosa es: Yo claramente no estoy tratando de conectarse a través de un socket UNIX pero usando TCP/IP. ¿Qué estoy haciendo mal? ¿Hay algo que me falta aquí?

Gracias por cualquier ayuda.

+2

¿Ha verificado que el servidor MySQL se está ejecutando? –

+0

relacionado/engañado: [Advertencia: mysql_connect \ (\): \ [2002 \] No existe tal archivo o directorio \ (tratando de conectarse a través de unix: ///tmp/mysql.sock \) en] (http: // stackoverflow .com/q/4219970) – blahdiblah

Respuesta

79

Está utilizando un socket Unix. Al leer "localhost", las bibliotecas cliente de MySQL no lo interpretan como el host TCP "localhost" y resuelven ese nombre, pero usan la ubicación de Socket predeterminada. Para usar TCP en la máquina local, debe usar 127.0.0.1 como nombre de host.

Para especificar el uso anterior unix_socket en lugar de host en el DSN. La ubicación del socket utilizado para localhost se puede definir en tiempo de compilación o en algunas versiones de PHP usando pdo_mysql.default_socket en el php.ini.

+0

¿Pero no hay una forma de desactivar esto? Quiero decir, estaba funcionando exactamente como está ayer. ¿Y cómo puedo habilitar el socket en el servidor para que funcione? –

+0

Tenía scripts PHP trabajando con 'localhost' en el archivo de configuración, y después de una actualización y reinicio de la RAM, dejaron de funcionar cuando se activaron desde la consola, aún funcionaban en el navegador. Cambiar 'localhost' a '127.0.0.1' lo solucionó. –

+0

127.0.0.1 hizo el truco. ¡Gracias! – Antony

7

De la documentación de PHP sobre la conexión a MySQL con DOP: PDO_MYSQL DNS

La nota al final dice:

Sólo Unix:

Cuando se establece el nombre de host a "localhost ", entonces la conexión al servidor se realiza a través de un socket de dominio. Si se compila PDO_MYSQL contra libmysql, la ubicación del archivo de socket se compilará en la ubicación de libmysql. Si se compila PDO_MYSQL contra mysqlnd, se puede establecer un socket predeterminado a través de la configuración pdo_mysql.default_socket.

Así que con el fin de solucionar este problema tendría que configurar correctamente en el php.ini la ubicación de su mysql.sock

  1. buscar el archivo mysql.sock. Los lugares comunes:

    • /tmp/mysql.sock
    • /tmp/mysql/mysql.sock
    • /var/mysql/mysql.sock
    • o si utiliza o MAMP mirada de la lámpara para el interior la carpeta tmp para MySQL
  2. editar el archivo php.ini y correctamente ajustado el valor de pdo_mysql.default_socket

  3. Reinicie su servidor Apache para recoger los cambios en el php.ini

0

Hay una actualización de la documentación para Drush que se documenta here.

2

acabo añade esta línea:

'unix_socket' => '/Applications/XAMPP/xamppfiles/var/mysql/mysql.sock', 

y todo estaba bien.

+3

¿Dónde agregaste esta línea? –

1

En Ubuntu, puede utilizar esta configuración en php.ini

pdo_mysql.default_socket=/var/run/mysqld/mysqld.sock 
Cuestiones relacionadas