PDOException SQLSTATE [HY000] [2002] Keine solche Datei oder kein solches Verzeichnis

319

Ich glaube, dass ich meine (sehr einfache) Site erfolgreich für fortrabbit bereitgestellt habe, aber sobald ich mich mit SSH verbinde, um einige Befehle (wie php artisan migrateoder php artisan db:seed) auszuführen, erhalte ich eine Fehlermeldung:

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

Irgendwann muss die Migration funktioniert haben, weil meine Tabellen vorhanden sind - aber das erklärt nicht, warum es jetzt bei mir nicht funktioniert.

Daniel Hollands
quelle
1
manchmal nur, weil Sie MySQL noch nicht installiert haben
Hassan Gilak

Antworten:

140

Die Fehlermeldung zeigt an, dass eine MySQL-Verbindung über Socket versucht wird (was nicht unterstützt wird).

Im Kontext von Laravel (Handwerker) möchten Sie wahrscheinlich eine andere / die richtige Umgebung verwenden. ZB: php artisan migrate --env=production(oder welche Umgebung auch immer). Siehe hier .

ukautz
quelle
1
Dies war die Lösung für mein Problem. Einer der Entwickler in unserem Unternehmen verwendet Homestead nicht und stellt über Socket eine Verbindung zu MySQL her. Ich habe die Socket-Konfiguration in meiner Datei app / database.php entfernt. Problem gelöst
Borislemke
Ich musste nur die Erweiterung mysqli.so in php.ini
Mehulkumar am
4
Ich musste "'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock'" zu config / database.php hinzufügen
Ángel Carlos del Pozo Muela
Hallo Community, ich erhalte diesen Fehler, obwohl ich kein Laravel verwende. Kannst du dir das Problem hier ansehen?
Kiran Patel
655

Laravel 4: Ändern Sie "host" in der app/config/database.phpDatei von "localhost" in "127.0.0.1".

Laravel 5: Ändern Sie "DB_HOST" in der .envDatei von "localhost" in "127.0.0.1".

Ich hatte genau das gleiche Problem. Keine der oben genannten Lösungen hat bei mir funktioniert. Ich habe das Problem gelöst, indem ich den "Host" in der Datei /app/config/database.php von "localhost" in "127.0.0.1" geändert habe.

Ich bin mir nicht sicher, warum "localhost" standardmäßig nicht funktioniert, aber ich fand diese Antwort in einer ähnlichen Frage, die in einem symfony2-Beitrag gelöst wurde. https://stackoverflow.com/a/9251924/1231563

Update: Einige Leute haben gefragt, warum dieses Update funktioniert, deshalb habe ich mich ein wenig mit dem Thema befasst. Es scheint, als würden sie unterschiedliche Verbindungstypen verwenden, wie in diesem Beitrag https://stackoverflow.com/a/9715164/1231563 erläutert

Das hier aufgetretene Problem ist, dass "localhost" einen UNIX-Socket verwendet und die Datenbank nicht im Standardverzeichnis finden kann. "127.0.0.1" verwendet jedoch TCP (Transmission Control Protocol), was im Wesentlichen bedeutet, dass es über das "lokale Internet" auf Ihrem Computer ausgeführt wird und in diesem Fall viel zuverlässiger als der UNIX-Socket ist.

stuyam
quelle
3
seltsam, dass es auch für mich die Lösung war, aber ich kann über die Befehlszeile eine Verbindung mit mysql herstellen --host = localhost - das funktioniert, aber nicht über PDO.
John
26
Ich würde gerne wissen, WARUM localhostnicht funktioniert und 127.0.0.1funktioniert?
Justin
6
Dies funktionierte für mich auf einem MAMP-System, auf dem eine PHP-Datei in der Befehlszeile (Terminal) ausgeführt wurde. Es funktionierte als Webseite, aber nicht als Befehlszeilendatei, bis ich localhost in '127.0.0.1' änderte
Samuel Fullman
1
@ Justin Ich denke, das liegt daran, dass localhost versucht, Socket zu verwenden, während 127.0.0.1 TCP verwendet.
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

Ich habe das gleiche Problem und verwende Mac OS X 10.10 Yosemite. Ich habe den Apache Server und PHP aktiviert, die bereits mit dem Betriebssystem geliefert werden. Dann habe ich gerade die mCrypt-Bibliothek konfiguriert, um loszulegen. Danach, als ich mit Modellen und DB arbeitete, bekam ich den Fehler:

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

Der Grund, den ich gefunden habe, ist nur, dass PHP und MySQL nicht selbst verbunden werden können. Um dieses Problem zu beheben, gehe ich wie folgt vor:

  1. Öffnen Sie ein Terminal und stellen Sie eine Verbindung zum MySQL her mit:

    mysql -u root -p
  2. Sie werden nach dem entsprechenden Passwort gefragt. Sobald Sie die MySQL-Eingabeaufforderung erhalten haben, geben Sie den nächsten Befehl ein:

    mysql> show variables like '%sock%'
  3. Sie werden so etwas bekommen:

    +-----------------------------------------+-----------------+
    | Variable_name                           | Value           |
    +-----------------------------------------+-----------------+
    | performance_schema_max_socket_classes   | 10              |
    | performance_schema_max_socket_instances | 322             |
    | socket                                  | /tmp/mysql.sock |
    +-----------------------------------------+-----------------+
    
  4. Behalten Sie den Wert der letzten Zeile bei:

    /tmp/mysql.sock
  5. Suchen Sie in Ihrem laravelProjektordner nach der Datei database.php, in der Sie die DB-Verbindungsparameter konfigurieren. Im mysql Abschnitt die nächste Zeile am Ende hinzu:

    'unix_socket' => '/tmp/mysql.sock'
  6. Sie müssen so etwas haben:

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

Speichern Sie jetzt einfach die Änderungen und laden Sie die Seite neu und es muss funktionieren!

alexventuraio
quelle
3
Die direkteste Lösung.
Vielen Dank
Danke dafür. Das hat bei mir funktioniert. Verwenden von OSX 10.10.5 MAMP Pro
marknt15
Dies funktionierte auch bei mir mit MAMP Pro und OS X 10.11.x. Am Ende war:/Applications/MAMP/tmp/mysql/mysql.sock
Bort License Plate
1
+1. Die Verwendung von "127.0.0.1" in der Konfiguration anstelle von "localhost", wie Yamartino in seiner Antwort sagte, funktioniert gut, aber mit einem Socket geht es schneller und diese Antwort löst das Problem. Es ist eine Schande, dass MySQL "localhost" so eigenartig behandelt, wenn unix_socket definiert ist ...
Shautieh
@ GregFerrell Ja, das stimmt, aber gut ... Ich hoffe, es könnte nützlich sein
alexventuraio
51

Ich bin [PDOException] SQLSTATE[HY000] [2002] No such file or directoryaus einem anderen Grund auf den Fehler gestoßen . Ich hatte gerade einen brandneuen LAMP-Stack unter Ubuntu 12.04 mit Apache 2.4.7, PHP v5.5.10 und MySQL 5.6.16 erstellt. Ich habe meine Websites wieder verschoben und sie gestartet. Aus den [PDOException]oben genannten Gründen konnte ich meine Laravel 4.2.x-basierte Site jedoch nicht laden . Also habe ich php -i | grep pdodiese Zeile überprüft und bemerkt:

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

Aber in meiner /etc/my.cnf befindet sich die Sockendatei tatsächlich in /var/run/mysqld/mysqld.sock.

Also öffnete ich meine php.ini und stellte den Wert ein für pdo_mysql.default_socket:

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

Dann habe ich Apache neu gestartet und überprüft php -i | grep pdo:

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

Das hat es für mich behoben.

dcarrith
quelle
Dies war das Update, das für mich funktioniert hat. Das Problem war, dass ich zwei Versionen von MySQL installiert und eine entfernt habe. Die Änderung von 127.0.0.1 hat nicht funktioniert oder die Socke in der Konfiguration hinzugefügt. Danke! @ Dcarrith
Luis
2
Dies half mir, mein Problem zu finden - nämlich, dass ich OSX-gebündeltes PHP verwendete, nicht die MAMP-PHP-Binärdatei. Stellen Sie also sicher, dass Sie die richtige Version von PHP verwenden, die auf die richtige PHP.ini usw. verweist. Definitiv "doh!" Moment.
Libelle
Die einzige Antwort, die für mich funktioniert hat. Vielen Dank.
Shahrukh Anwar
43

Die Antwort von @stuyam löste das Problem "Keine solche Datei oder kein solches Verzeichnis" für mich

Kurze Antwort: Ändern Sie "host" in der Datei /app/config/database.php von "localhost" in "127.0.0.1".

Aber dann hatte ich einen Fehler "Verbindung abgelehnt". Wenn jemand das gleiche Problem hatte, bestand meine Lösung darin, die Datei app / config / local / database.php so zu aktualisieren, dass der Port 8889 lautet:

'mysql' => array(
        'driver'    => 'mysql',
        'host'      => '127.0.0.1',
        'port'      => '8889',
        'database'  => 'databaseName',
        'username'  => 'root',
        'password'  => 'root',
        'charset'   => 'utf8',
        'collation' => 'utf8_unicode_ci',
        'prefix'    => '',
    ),
Marlow
quelle
4
In meinem Fall war es 'port' => '33060'aber diese Antwort brachte mich dorthin!
Mopo922
25

Wenn Sie Laravel Homestead verwenden, stellen Sie sicher, dass Sie die Befehle auf dem Server aufrufen.

homestead ssh

Dann cd einfach in das richtige Verzeichnis und feuere dort deinen Befehl ab.

Koen B.
quelle
2
Dies funktionierte, ich führte zuerst einen Befehl von meinem Computer aus, anstatt ssh in VM, und führte dort einen Befehl aus.
cmac
Ich vergesse diesen Schritt immer. Heh. 1. source ~/.zshrc2. homestead up --provision3.homestead ssh
Marcel
1
vagrant sshin meinem Fall
Marcos Curvello
22

In meinem Fall hatte ich überhaupt kein Problem, habe nur vergessen, den MySQL-Dienst zu starten ...

sudo service mysqld start
Carlos ABS
quelle
19

Mamp-Benutzeraktivierungsoption Netzwerkzugriff auf MYSQL zulassen

Geben Sie hier die Bildbeschreibung ein

George John
quelle
18

Fügen Sie den Pfad mysql.sock wie im folgenden Beispiel in die Datei database.php ein

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

Beispiel

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

Es hat funktioniert, nachdem ich von DB_HOST=localhostzu DB_HOST=127.0.0.1.env-Datei gewechselt habe

NuOne
quelle
2
Das hat funktioniert, du hast recht. Haben Sie Ideen, warum localhostdas nicht funktioniert?
Fusion
1
@Fusion Wenn Sie Ihre App in einem Container ausführen, wird 'localhost' als Container verstanden. 127.0.0.1 weist ihn an, die
Datenbank
Ich hatte auch ein solches Problem, konnte den Cache nicht leeren oder den Handwerkeraufschlag ausführen
Tom Mwenda
17

Dies liegt daran, dass PDO den "localhost" -Host speziell behandelt:

Hinweis: Nur Unix: Wenn der Hostname auf "localhost" gesetzt ist, wird die Verbindung zum Server über einen Domain-Socket hergestellt. Wenn PDO_MYSQL gegen libmysqlclient kompiliert wird, befindet sich der Speicherort der Socket-Datei am Speicherort von libmysqlclient. Wenn PDO_MYSQL für mysqlnd kompiliert wird, kann über die Einstellung pdo_mysql.default_socket ein Standard-Socket festgelegt werden.

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

Wenn Sie localhost in 127.0.0.1 ändern, wird die Verwendung von TCP "erzwungen".

Hinweis: mysqli_connect funktioniert einwandfrei mit localhost.

Thomas Decaux
quelle
12

Aufbauend auf der Antwort von @dcarrith ...

Anstatt die Konfigurationsdateien zu bearbeiten, habe ich an dem von PHP gesuchten Speicherort einen Alias ​​erstellt, der eine Verbindung zum echten mysql.sock herstellt. ( Quelle )

Führen Sie einfach diese beiden Befehle aus (kein Neustart erforderlich):

mkdir /var/mysql
ln -s /tmp/mysql.sock /var/mysql/mysql.sock
Justin
quelle
11

Schritt 1

Suchen Sie den Pfad zu Ihrem unix_socket, um dies zu tun, führen Sie es einfach aus netstat -ln | grep mysql

Sie sollten so etwas bekommen

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

Schritt 2

Nehmen Sie das und fügen Sie es in Ihren unix_socket- Parameter ein

'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' <-----
            ),
        ),

Ich hoffe es hilft !!

cyber8200
quelle
8

Ich arbeite mit MAMP Pro und hatte dieses ähnliche Problem beim Versuch zu migrieren (DB-Tabellen erstellen). Versuchte auch einige dieser erwähnten Vorschläge, tat es aber nicht für mich.

Also habe ich einfach (nach einer Stunde googeln) der /config/database.php zwei Dinge hinzugefügt.

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

Funktioniert jetzt gut!

anoraq
quelle
4

Überprüfen Sie Ihren Port sorgfältig. In meinem Fall war es 8889 und ich verwende 8888. Ändern Sie "DB_HOST" von "localhost" in "127.0.0.1" und umgekehrt

Ahmed Awan
quelle
Großartig, danke, mein Hafen war 3306, aber mein richtiger Hafen ist 8889
David
4

Ich hatte diese Probleme, als ich meine Anwendung mit Docker-Containern ausführte.

Die Lösung wurde mit dem Namen des MySQL- docker_compose.ymlDienstcontainers versehen, den ich in DB_HOST verwendet habe. In meinem Fall war es db:

DB_HOST=db

Ich hoffe es hilft.

Lano
quelle
2

Ab Laravel 5 werden der Benutzername und das Kennwort der Datenbank in der .env-Datei gespeichert, die im Projektverzeichnis vorhanden ist, z

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

Wie Sie sehen können, überschreiben diese Umgebungsvariablen hier die 'Forge'-Zeichenfolgen, sodass eine Änderung keine Auswirkungen hat:

    '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,
    ],

Weitere Informationen finden Sie hier https://mattstauffer.co/blog/laravel-5.0-environment-detection-and-environment-variables

malhal
quelle
2

Ich bin auf dieses Problem gestoßen, als ich PHPUnit in Elixir / Gulp und Homestead als meine Vagrant-Umgebung ausgeführt habe.

In meinem Fall habe ich die .env-Datei von dort bearbeitet DB_HOST=localhost, DB_HOST=192.168.10.10wo 192.168.10.10sich die IP meines Vagrant / Homestead-Hosts befindet.


quelle
2

Versuch, eine Verbindung zu localhost herzustellen:

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

Versuch, eine Verbindung zu 127.0.0.1 herzustellen:

SQLSTATE[HY000] [2002] Connection refused

OK, kommentieren / entfernen Sie einfach die folgende Einstellung aus my.cnf (unter OS X 10.5 :) /opt/local/etc/mysqlxx/my.cnf, um zu erhalten:

[mysqld]
# skip-networking

Stoppen und starten Sie MySQL Server.

Anna Logg
quelle
2

Ich hatte ähnliche Probleme beim Zugriff auf meine Drupal-Website. Ich habe das Problem behoben, indem ich die Befehlszeile geöffnet und meinen MySQL-Server oder -Dienst neu gestartet habe:

service mysqld restart

Das sollte funktionieren. Wenn dies nicht der Fall ist, starten Sie Ihren lokalen Webserver neu:

service httpd restart

Das sollte genug sein. Hoffe, es funktioniert auch für andere Umgebungen. Beachten Sie, dass diese Befehle im Allgemeinen Superuser-Berechtigungen erfordern.

RAWGIT
quelle
1

Wenn Sie Laravel Homestead verwenden, finden Sie hier Einstellungen

(einschließlich Vagrant-Virtual Machine)

.bash-Profil

alias vm="ssh [email protected] -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
ErcanE
quelle
1

Wenn noch jemand nach der Antwort sucht, überprüfen Sie einfach Ihre .env-Datei. Aus irgendeinem Grund hat laravel eine .env.example-Datei erstellt, sodass all diese Antworten bei mir nicht funktionierten. Ich habe mein Problem behoben, indem ich .env.example in .env umbenannt habe

Alberto Alegria
quelle
Es gibt keine einzige richtige Antwort auf diese Frage, da verschiedene Fehler gemacht werden können. Dies ist einer von ihnen, da die .env-Datei nicht auf einen Remote-Server kopiert werden kann. Es lohnt sich daher, die ENV-Datei auf dem Server zu überprüfen, auf dem Sie die Abfrage ausführen möchten, um sicherzustellen, dass beide vorhanden sind und die zum Herstellen einer Verbindung erforderlichen Informationen enthalten.
Petercoles
1

Das ist mir passiert, weil MySQL nicht lief. MySQL konnte nicht gestartet werden, da ein /usr/local/etc/my.cnf.d/Verzeichnis fehlte .

Dies wurde von meiner /usr/local/etc/my.cnfKonfigurationsdatei als glob include ( include /usr/local/etc/my.cnf.d/*.cnf) benötigt.

Das Ausführen mkdir /usr/local/etc/my.cnf.dund anschließende Starten von MySQL hat das Problem behoben.

james2doyle
quelle
1

In meinem Fall habe ich PHP Artisan Migrate auf meinem Mac-Terminal ausgeführt, als ich in Vagabund ssh musste und es von dort aus ausführen musste. Hoffe das hilft jemandem die Kopfschmerzen.

Brad
quelle
1

Ich hatte das gleiche Problem bei der Verwendung des dbDocker- und MySQL- Dienstnamens in der Datei docker_compose.yml:

Ich habe folgendes in die .envDatei eingefügt :

DB_HOST=db

Sie sollten auch sicherstellen, dass Ihr Host über die PHP-App erkennbar ist.

Dies lag daran, dass PHP nicht herausgefunden hat, mit welchem ​​Host eine Verbindung hergestellt werden soll.

Oscar David
quelle
0

Wenn Sie eine VirtualMachine verwenden, stellen Sie sicher, dass Sie sich auf diesem Computer befinden, zu Ihrem App-Ordner navigieren und von dort aus den Befehl php artisan migrate aufrufen.

cmac
quelle
0

Im Mai hatte ich einfach verwendet

vagrant up

anstatt

homestead up

für meine Schmiede Larven Setup mit Homestead. Ich gehe davon aus, dass dies bedeutete, dass die Site bereitgestellt wurde, aber der MySQL-Server wurde nie gestartet. Als ich den letzteren Befehl verwendete, um meine Vagabundbox zu starten, verschwand der Fehler.

Ben Wilson
quelle
0

All diese Antworten scheinen schwer zu heben ...

Ich habe gerade eine .envDatei erstellt. bearbeitete meine bootstrap/app.phpDatei und kommentierte die folgende Zeile aus ...

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

Hoffe das hilft jemandem

MrMesees
quelle
0

Für alle, die versuchen, eine neue Datenbankverbindung zu erstellen, nicht auf Laravel, sondern hier auf der Suche nach Antworten, um PDO vom Terminal aus auszuführen. Dies würde Ihnen helfen. Und Sie können es so umgestalten, dass es am besten für Sie funktioniert.

<?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

} 

ich hoffe es hilft!

Ifeanyi Amadi
quelle
0

In meinem Fall musste ich den Bootstrap / Cache-Ordner entfernen und es erneut versuchen.

Mein Szenario war nach einer Servermigration.

Raphael Cangucu
quelle