PDOException SQLSTATE [HY000] [2002] Brak takiego pliku lub katalogu


319

Wierzę, że udało mi się wdrożyć moją (bardzo podstawową) witrynę na fortrabbit, ale jak tylko połączę się z SSH w celu uruchomienia niektórych poleceń (takich jak php artisan migratelub php artisan db:seed) , pojawia się komunikat o błędzie:

[PDOException]
SQLSTATE[HY000] [2002] No such file or directory

W pewnym momencie migracja musiała zadziałać, ponieważ moje tabele już tam są - ale to nie wyjaśnia, dlaczego nie działa teraz dla mnie.



1
czasami to tylko dlatego, że nie zainstalowałeś jeszcze mysql
Hassan Gilak

Odpowiedzi:


142

Komunikat o błędzie wskazuje, że próbowane jest połączenie MySQL przez gniazdo (co nie jest obsługiwane).

W kontekście Laravela (rzemieślnika) prawdopodobnie chcesz użyć innego / właściwego środowiska. Np .: php artisan migrate --env=production(lub dowolne środowisko). Zobacz tutaj .


1
To było rozwiązanie mojego problemu, jeden z programistów w naszej firmie nie używa Homestead i łączy się z mysql przez gniazdo. Usunąłem konfigurację gniazda w pliku app / database.php. Problem rozwiązany
borislemke

Właśnie musiałem włączyć rozszerzenie mysqli.so w php.ini
Mehulkumar 23.04.17

4
Musiałem dodać „'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock'” do config / database.php
Ángel Carlos del Pozo Muela

witaj społeczność, otrzymuję ten błąd, mimo że nie używam laravel, czy możesz spojrzeć na problem tutaj, jest on stackoverflow.com/questions/60796332/...
Kiran Patel

655

Laravel 4: Zmień „host” w app/config/database.phppliku z „localhost” na „127.0.0.1”

Laravel 5: Zmień „DB_HOST” w .envpliku z „localhost” na „127.0.0.1”

Miałem dokładnie ten sam problem. Żadne z powyższych rozwiązań nie działało dla mnie. Rozwiązałem problem, zmieniając „host” w pliku /app/config/database.php z „localhost” na „127.0.0.1”.

Nie jestem pewien, dlaczego „localhost” domyślnie nie działa, ale znalazłem tę odpowiedź w podobnym pytaniu rozwiązanym w poście symfony2. https://stackoverflow.com/a/9251924/1231563

Aktualizacja: Niektóre osoby zapytały, dlaczego ta poprawka działa, więc przeprowadziłem trochę badań w tym temacie. Wygląda na to, że używają różnych typów połączeń, jak wyjaśniono w tym poście https://stackoverflow.com/a/9715164/1231563

Problem polega na tym, że „localhost” korzysta z gniazda UNIX i nie może znaleźć bazy danych w standardowym katalogu. Jednak „127.0.0.1” używa protokołu TCP (Transmission Control Protocol), co w istocie oznacza, że ​​działa on przez „lokalny internet” na twoim komputerze i jest w tym przypadku znacznie bardziej niezawodny niż gniazdo UNIX.


3
dziwne, że było to również rozwiązanie dla mnie, ale jestem w stanie połączyć się z wiersza poleceń za pomocą mysql --host = localhost - który działa, ale nie z PDO.
John

26
Chciałbym wiedzieć, DLACZEGO DLACZEGO localhostnie działa i 127.0.0.1działa?
Justin

6
Działa to dla mnie w systemie MAMP, w którym uruchomiono plik php w wierszu poleceń (terminal). Działał jako strona internetowa, ale nie jako plik wiersza poleceń, dopóki nie zmieniłem localhost na „127.0.0.1”
Samuel Fullman

1
@ Justin Myślę, że to dlatego, że localhost próbuje użyć gniazda, podczas gdy 127.0.0.1 używa TCP.
pebbo,

10
A Unix socket file is used if you do not specify a host name or if you specify the special host name localhost. dev.mysql.com/doc/refman/5.7/en/can-not-connect-to-server.html
x-yuri

94

Mam ten sam problem i korzystam z systemu Mac OS X 10.10 Yosemite. Włączyłem serwer Apache i PHP, które są już dostarczane z systemem operacyjnym. Potem właśnie skonfigurowałem bibliotekę mCrypt, aby zacząć. Potem, kiedy pracowałem z modelami i DB, dostałem błąd:

[PDOException]
SQLSTATE[HY000] [2002] No such file or directory

Powodem jest to, że PHP i MySQL nie mogą się połączyć. Aby rozwiązać ten problem, wykonuję następujące kroki:

  1. Otwórz terminal i połącz się z mysql za pomocą:

    mysql -u root -p
  2. Zostaniesz poproszony o podanie hasła. Następnie, gdy pojawi się komunikat mysql, wpisz następną komendę:

    mysql> show variables like '%sock%'
  3. Otrzymasz coś takiego:

    +-----------------------------------------+-----------------+
    | Variable_name                           | Value           |
    +-----------------------------------------+-----------------+
    | performance_schema_max_socket_classes   | 10              |
    | performance_schema_max_socket_instances | 322             |
    | socket                                  | /tmp/mysql.sock |
    +-----------------------------------------+-----------------+
    
  4. Zachowaj wartość ostatniego wiersza:

    /tmp/mysql.sock
  5. W laravelfolderze projektu poszukaj pliku database.php tam, gdzie konfigurujesz parametry połączenia DB. W sekcji mysql dodaj następny wiersz na końcu:

    'unix_socket' => '/tmp/mysql.sock'
  6. Musisz mieć coś takiego:

    'mysql' => array(
            'driver'    => 'mysql',
            'host'      => 'localhost',
            'database'  => 'SchoolBoard',
            'username'  => 'root',
            'password'  => 'venturaa',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'unix_socket' => '/tmp/mysql.sock',
        ),
    

Teraz po prostu zapisz zmiany i ponownie załaduj stronę, a to musi działać!


3
Najbardziej „proste do wydania” rozwiązanie. Dzięki, to naprawiło mnie na uruchomieniu Laravela z MAMP pro
animaacija

Dzięki za to. To zadziałało dla mnie. Korzystanie z OSX 10.10.5 MAMP Pro
marknt15

Działa to również dla mnie z MAMP pro i OS X 10.11.x. Skończyło się na:/Applications/MAMP/tmp/mysql/mysql.sock
Tablicy rejestracyjnej Bort

1
+1. Używanie „127.0.0.1” w konfiguracji zamiast „localhost”, jak powiedział Yamartino w swojej odpowiedzi, działa dobrze, ale jest szybsze z gniazdem i ta odpowiedź rozwiązuje problem. Szkoda, że ​​mysql traktuje „localhost” w taki szczególny sposób, gdy zdefiniowano
unix_socket

@GregFerrell Tak, to prawda, ale dobrze ... Mam nadzieję, że może się przydać
alexventuraio

51

Wystąpił [PDOException] SQLSTATE[HY000] [2002] No such file or directorybłąd z innego powodu. Właśnie skończyłem budować nowy stos LAMP na Ubuntu 12.04 z Apache 2.4.7, PHP v.5.5.10 i MySQL 5.6.16. Przeniosłem moje strony z powrotem i uruchomiłem je. Ale nie mogłem załadować mojej witryny opartej na Laravel 4.2.x z powodu [PDOException]powyższego. Więc sprawdziłem php -i | grep pdoi zauważyłem ten wiersz:

pdo_mysql.default_socket => /tmp/mysql.sock => /tmp/mysql.sock

Ale w moim /etc/my.cnf plik skarpety jest w rzeczywistości /var/run/mysqld/mysqld.sock.

Więc otworzyłem swój php.ini i ustawiłem wartość dla pdo_mysql.default_socket:

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

Następnie zrestartowałem apache i sprawdziłem php -i | grep pdo:

pdo_mysql.default_socket => /var/run/mysqld/mysqld.sock => /var/run/mysqld/mysqld.sock

To naprawiło to dla mnie.


To była poprawka, która działała dla mnie, problem polegał na tym, że zainstalowałem dwie wersje mysql i usunąłem jedną, zmiana 127.0.0.1 nie działała lub dodałem skarpetę do konfiguracji, dzięki! @dcarrith
Luis

2
Pomogło mi to znaleźć mój problem - polegałem na tym, że korzystałem z pakietu php OSX, a nie pliku binarnego MAMP php. Upewnij się więc, że używasz odpowiedniej wersji php, która wskazuje prawidłowy plik php.ini itp. Zdefiniuj „doh!” za chwilę.
ważka

43

Odpowiedź @stuyam rozwiązała dla mnie problem „Brak takiego pliku lub katalogu”

Krótka odpowiedź: zmień „host” w pliku /app/config/database.php z „localhost” na „127.0.0.1”

Ale potem wystąpił błąd „Odmowa połączenia”. Jeśli ktoś miał ten sam problem, moim rozwiązaniem było zaktualizowanie pliku app / config / local / database.php, aby port miał numer 8889:

'mysql' => array(
        'driver'    => 'mysql',
        'host'      => '127.0.0.1',
        'port'      => '8889',
        'database'  => 'databaseName',
        'username'  => 'root',
        'password'  => 'root',
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
    ),

4
W moim przypadku tak było, 'port' => '33060'ale ta odpowiedź mnie tam doprowadziła!
mopo922

25

Jeśli korzystasz z Laravel Homestead, upewnij się, że wywołujesz polecenia na serwerze.

homestead ssh

Następnie po prostu przejdź do odpowiedniego katalogu i uruchom tam swoje polecenie.


2
To działało, najpierw uruchomiłem polecenie z mojego komputera zamiast ssh na maszynie wirtualnej i uruchomiłem tam polecenie.
cmac

Zawsze zapominam o tym kroku. Heh 1. source ~/.zshrc2. homestead up --provision3.homestead ssh
Marcel

1
vagrant sshw moim przypadku
Marcos Curvello

22

W moim przypadku nie miałem żadnego problemu, po prostu zapomniałem uruchomić usługę mysql ...

sudo service mysqld start


18

Dodaj ścieżkę mysql.sock w pliku database.php jak w poniższym przykładzie

'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock',

Na przykład

'mysql' => [
        'driver' => 'mysql',
        'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock',
        'host' => env('DB_HOST', 'localhost'),
        'port' => env('DB_PORT', '8889'),

18

To działało po zmianie I od DB_HOST=localhostdo DB_HOST=127.0.0.1w .env pliku


2
To działało, masz rację. Czy masz jakieś pomysły wyjaśniające, dlaczego localhostnie działa?
Fusion

1
@Fusion, jeśli uruchamiasz aplikację w kontenerze, będzie on rozumiał „localhost” jako kontener, 127.0.0.1 mówi, aby używał
bazy

Miałem też taki problem, nie mogłem wyczyścić pamięci podręcznej ani uruchomić serwowania rzemieślnika
Tom Mwenda

17

Wynika to z tego, że PDO traktuje hosta „localhost” specjalnie:

Uwaga: Tylko Unix: Gdy nazwa hosta jest ustawiona na „localhost”, połączenie z serwerem jest nawiązywane przez gniazdo domeny. Jeśli PDO_MYSQL jest skompilowany z libmysqlclient, wówczas lokalizacja pliku gniazda znajduje się w lokalizacji libmysqlclient. Jeśli PDO_MYSQL jest skompilowany z mysqlnd, można ustawić domyślne gniazdo poprzez ustawienie pdo_mysql.default_socket.

(z http://php.net/manual/en/ref.pdo-mysql.connection.php )

Zmiana localhost na 127.0.0.1 „wymusi” użycie TCP.

Uwaga: mysqli_connect działa poprawnie z localhost.


12

Opierając się na odpowiedzi od @dcarrith ...

Zamiast edytować pliki konfiguracyjne, utworzyłem alias w miejscu, w którym szuka PHP, który łączy się z prawdziwym mysql.sock. ( źródło )

Po prostu uruchom te dwa polecenia (nie trzeba restartować):

mkdir /var/mysql
ln -s /tmp/mysql.sock /var/mysql/mysql.sock

11

Krok 1

Znajdź ścieżkę do swojego unix_socket, aby to zrobić, po prostu uruchom netstat -ln | grep mysql

Powinieneś dostać coś takiego

unix  2      [ ACC ]     STREAM     LISTENING     17397    /var/run/mysqld/mysqld.sock

Krok 2

Weź to i dodaj do swojego parametru unix_socket

'mysql' => array(
            'driver'    => 'mysql',
            'host'      => '67.25.71.187',
            'database'  => 'dbname',
            'username'  => 'username',
            'password'  => '***',
            'charset'   => 'utf8',
            'collation' => 'utf8_unicode_ci',
            'prefix'    => '',
            'unix_socket'    => '/var/run/mysqld/mysqld.sock' <-----
            ),
        ),

Mam nadzieję, że to pomoże !!


8

Korzystam z MAMP Pro i miałem podobny problem podczas próby migracji (tworzenie tabel db). Wypróbowałem kilka z tych sugestii, ale nie zrobiłem tego dla mnie.

Po prostu (po godzinie googlingu) dodałem dwie rzeczy do pliku /config/database.php.

'port' => '1234',
'unix_socket' => '/path/to/my/socket/mysqld.sock'

Działa dobrze teraz!


4

Sprawdź dokładnie swój port. W moim przypadku było 8889 i używam 8888. zmień „DB_HOST” z „localhost” na „127.0.0.1” i odwrotnie


Świetnie, dziękuję, mój port to 3306, ale mój prawdziwy port to 8889
David

4

Miałem te problemy, kiedy działałem z wykorzystaniem kontenerów dokerów.

Rozwiązaniem było umieszczenie nazwy kontenera usługi MySQL, którego docker_compose.ymlużywałem w DB_HOST. W moim przypadku było to db:

DB_HOST=db

Mam nadzieję, że to pomoże.


2

Od wersji Laravel 5 nazwa użytkownika i hasło do bazy danych znajduje się w pliku .env, który istnieje w katalogu projektu, np

DB_HOST=127.0.0.1
DB_DATABASE=db1
DB_USERNAME=user1
DB_PASSWORD=pass1

Jak widać, zmienne środowiskowe zastępują ciągi „forge” tutaj, więc ich zmiana nie ma wpływu:

    'mysql' => [
        'driver'    => 'mysql',
        'host'      => env('DB_HOST', 'localhost'),
        'database'  => env('DB_DATABASE', 'forge'),
        'username'  => env('DB_USERNAME', 'forge'),
        'password'  => env('DB_PASSWORD', ''),
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
        'strict'    => false,
    ],

Więcej informacji znajduje się tutaj https://mattstauffer.co/blog/laravel-5.0-environment-detection-and-environment-variables


2

Natknąłem się na ten problem podczas uruchamiania PHPUnit w Elixir / Gulp i Homestead jako moim środowisku Vagrant.

W moim przypadku edytowany plik .env od DB_HOST=localhostcelu DB_HOST=192.168.10.10, gdzie 192.168.10.10jest moje IP hosta Vagrant / Homestead.


2

Próba połączenia z hostem lokalnym:

SQLSTATE[HY000] [2002] No such file or directory

Próba połączenia z 127.0.0.1:

SQLSTATE[HY000] [2002] Connection refused

OK, po prostu skomentuj / usuń następujące ustawienie z my.cnf (w OS X 10.5:), /opt/local/etc/mysqlxx/my.cnfaby uzyskać:

[mysqld]
# skip-networking

Oczywiście zatrzymaj i uruchom MySQL Server.


2

Miałem podobne problemy z dostępem do mojej witryny Drupal. Naprawiłem to, otwierając wiersz poleceń i ponownie uruchamiając mój serwer lub usługę MySQL:

service mysqld restart

To powinno działać. Jeśli nie, zrestartuj lokalny serwer WWW:

service httpd restart

To powinno wystarczyć. Mam nadzieję, że działa również w innych środowiskach. Zauważ, że te polecenia zazwyczaj wymagają uprawnień administratora.


1

Jeśli korzystasz z Laravel Homestead, oto ustawienia

(w tym Vagrant-Virtual Machine)

.bash-profil

alias vm="ssh vagrant@127.0.0.1 -p 2222"

database.php

    'mysql' => [
        'driver'    => 'mysql',
        'host'      => env('DB_HOST', '127.0.0.1'),
        'database'  => env('DB_DATABASE', 'homestead'),
        'username'  => env('DB_USERNAME', 'homestead'),
        'password'  => env('DB_PASSWORD', 'secret'),
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
        'strict'    => false,
    ],

Terminal

vm

vagrant@homestead:~/Code/projectFolder  php artisan migrate:install

1

Jeśli ktoś nadal szuka odpowiedzi, po prostu sprawdź plik .env. Z jakiegoś powodu laravel tworzy plik .env.example, więc wszystkie te odpowiedzi nie działały dla mnie. Naprawiłem problem ze zmianą nazwy pliku .env. Na .env


Nie ma jednej poprawnej odpowiedzi na to pytanie, ponieważ można popełnić wiele błędów. To jeden z nich, ponieważ nie można skopiować pliku .env na zdalny serwer. Warto więc sprawdzić plik .env na serwerze, na którym próbujesz uruchomić zapytanie, aby upewnić się, że istnieje i zawiera niezbędne informacje do nawiązania połączenia.
petercoles

1

Stało się tak, ponieważ MySQL nie działał. Uruchomienie MySQL nie powiodło się, ponieważ brakowało mi /usr/local/etc/my.cnf.d/katalogu.

Było to wymagane przez mój /usr/local/etc/my.cnfplik konfiguracyjny jako glob include ( include /usr/local/etc/my.cnf.d/*.cnf).

Uruchomienie mkdir /usr/local/etc/my.cnf.d, a następnie uruchomienie MySQL rozwiązało problem.


1

W moim przypadku uruchomiłem migrację php rzemieślnika na terminalu Mac, kiedy musiałem ssh na włóczęgę i uruchomić go stamtąd. Mam nadzieję, że to pomaga komuś na ból głowy.


1

Miałem ten sam problem przy użyciu Docker i nazwy usługi MySQL dbw pliku docker_compose.yml:

W .envpliku dodałem następujące elementy :

DB_HOST=db

powinieneś także upewnić się, że twój host jest wykrywalny z aplikacji php.

Było tak, ponieważ PHP nie wymyśliło, którego hosta użyć do połączenia.


0

Podczas korzystania z VirtualMachine upewnij się, że ssh na tym komputerze i przejdź do folderu aplikacji i stamtąd wywołać polecenie php artisan migrate.


0

W przeciwnym razie po prostu użyłem

vagrant up

zamiast

homestead up

dla mojej konfiguracji larwy kuźni za pomocą zagrody. Zakładam, że oznaczało to, że witryna była obsługiwana, ale serwer MySQL nigdy nie był uruchamiany. Kiedy użyłem tego ostatniego polecenia, aby uruchomić moje błędne pudełko, błąd zniknął.


0

Wszystkie te odpowiedzi wydają się jak podnoszenie ciężarów ...

Właśnie utworzyłem .envplik; edytowałem mój bootstrap/app.phpplik i odkomentowałem następujący wiersz ...

Dotenv::load(__DIR__.'/../');

Mam nadzieję, że to komuś pomoże


0

Dla każdego, kto próbuje utworzyć nowe połączenie db nie na laravel, ale natknął się tutaj, szukając odpowiedzi na uruchomienie PDO z terminala. To by ci pomogło. Możesz go zmienić tak, aby działał najlepiej dla Ciebie.

<?php

class db
{
   private $DBHOST = 'localhost'; // you don't need 127.0.0.1
   private $DRIVER = 'mysql';
   private $PORT   = '8888'; // database port. 8888 is mine
   private $DB     = 'example-db';
   private $PASS   = 'example-pass';
   private $USER   = 'root';
   private $SOCKS  = ''; // can fill this or leave blank.


   // - connect (dummy connection)
   private function con()
   {
       if ($this->SOCKS == '')
       {
           // run shell command to get 
           $socks = shell_exec('netstat -ln | grep mysql');
           $socks = trim(substr($socks, strpos($socks, '/')));

           $this->SOCKS = strlen($socks) > 0 ? ';unix_socket='.$socks : '';
       }
       else
       {
          $this->SOCKS = ';unix_socket='.$this->SOCKS;
       }

       $dsn = $this->DRIVER.':host='.$this->DBHOST.';dbname='.$this->DB;

       // add socks
       $dsn .= $this->SOCKS;

       // add port
       $dsn .= (strlen($this->PORT) > 0) ? ';port='.$this->PORT : '';

       // extablish connection
       $con = new PDO($dsn, $user, $pass);

       // return PDO instance.
       return $con;
   }
   // - ends here

   // now you can call $this->con() within class to use connection 
   // would run fine on any terminal

} 

mam nadzieję, że to pomoże!


0

W moim przypadku musiałem usunąć folder bootstrap / cache i spróbować ponownie.

Moje cenario było po migracji serwera.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.