2009-11-30 21 views
26

Mój kod działał dobrze wczoraj i dzisiaj nagle nie chce się łączyć z moją bazą danych. Nie zmieniłem ustawień ani kodu, ani nie zaktualizowałem żadnego oprogramowania. Wszystko co robię to w ten sposób:Błąd podczas łączenia się z MySQL przy użyciu PHP/PDO

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

I uzyskać ładny komunikat wyjątku mówiąc to:

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

Chodzi o to: Ja oczywiście nie próbuje połączyć się przy użyciu gniazda unix ale przy użyciu protokołu TCP/IP. Co ja robię źle? Czy jest tu coś, czego mi brakuje?

Dzięki za pomoc.

+2

Czy sprawdzono, że serwer MySQL działa? –

+0

Powiązane/dupe: [Ostrzeżenie: mysql_connect \ (\): \ [2002 \] Brak takiego pliku lub katalogu \ (próba połączenia przez unix: ///tmp/mysql.sock \) in] (http: // stackoverflow .com/q/4219970) – blahdiblah

Odpowiedz

79

Używasz gniazda Unix. Podczas odczytywania "localhost" bibliotek klienta MySQL nie interpretujemy go jako hosta TCP "localhost" i nie rozpoznajemy tej nazwy, ale używamy domyślnej lokalizacji Socket. Aby korzystać z protokołu TCP na komputerze lokalnym, jako nazwę hosta należy użyć 127.0.0.1.

Aby określić poprzednie użycie, należy użyć unix_socket zamiast host w DSN. Lokalizacja gniazda używanego do localhost może być zdefiniowana podczas kompilacji lub w niektórych wersjach PHP przy użyciu pdo_mysql.default_socket w php.ini.

+0

Ale czy nie ma sposobu, aby to wyłączyć? Mam na myśli, że działało dokładnie tak, jak jest - jest wczoraj. I jak mogę włączyć gniazdo na serwerze, aby działało? –

+0

Miałem skrypty PHP pracujące z "localhost" w pliku konfiguracyjnym, a po aktualizacji RAM i ponownym uruchomieniu, przestały działać po uruchomieniu z konsoli - nadal działało w przeglądarce. Zmiana "localhost" na "127.0.0.1" naprawiła to. –

+0

127.0.0.1 załatwił sprawę. Dzięki! – Antony

7

Z dokumentacji PHP na temat podłączenia do MySQL za pomocą PDO: PDO_MYSQL DNS

Notatka na samym końcu mówi:

tylko Unix:

Jeśli nazwa hosta jest ustawiony na „localhost ", następnie połączenie z serwerem odbywa się przez gniazdo domeny. Jeśli PDO_MYSQL jest kompilowany pod adresem libmysql, lokalizacja pliku gniazda znajduje się w bibliotece libmysql skompilowanej w lokalizacji. Jeśli PDO_MYSQL jest kompilowany przeciwko mysqlnd, domyślne gniazdo można ustawić za pomocą ustawienia pdo_mysql.default_socket.

Aby więc naprawić to trzeba by prawidłowo skonfigurować w php.ini lokalizację mysql.sock

  1. znaleźć plik mysql.sock. Najczęstsze lokalizacje:

    • /tmp/mysql.sock
    • /tmp/mysql/mysql.sock
    • /var/mysql/mysql.sock
    • lub jeśli używasz MAMP lub lampy szukać wewnątrz folder tmp dla mysql
  2. Edycja pliku php.ini i prawidłowo ustawić wartość dla pdo_mysql.default_socket

  3. Zrestartuj swój serwer Apache, aby pobrać zmiany w php.ini

0

Jest to aktualizacja docs dla Drush który jest udokumentowanych here.

2

Właśnie dodałem ten wiersz:

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

i wszystko było dobrze.

+3

Gdzie dodano tę linię? –

1

Na Ubuntu, można użyć tego ustawienia w php.ini

pdo_mysql.default_socket=/var/run/mysqld/mysqld.sock 
Powiązane problemy