PDOException SQLSTATE [HY000] [2002] Aucun fichier ou répertoire de ce type


320

Je crois que j'ai réussi à déployer mon site (très basique) sur fortrabbit, mais dès que je me connecte à SSH pour exécuter certaines commandes (comme php artisan migrateou php artisan db:seed), j'obtiens un message d'erreur:

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

À un moment donné, la migration a dû fonctionner, car mes tables sont là - mais cela n'explique pas pourquoi cela ne fonctionne pas pour moi maintenant.



1
parfois juste parce que vous n'avez pas encore installé mysql
Hassan Gilak

Réponses:


142

Le message d'erreur indique qu'une connexion MySQL via socket est tentée (ce qui n'est pas pris en charge).

Dans le cadre de Laravel (artisan), vous souhaiterez probablement utiliser un environnement différent / correct. Par exemple: php artisan migrate --env=production(ou n'importe quel environnement). Voyez ici .


1
Ce fut la solution à mon problème, l'un des développeurs de notre société n'utilise pas Homestead et se connecte à mysql via socket. J'ai supprimé la configuration de socket dans mon fichier app / database.php. Problème résolu
borislemke

Je devais juste activer l'extension mysqli.so dans php.ini
Mehulkumar

4
J'ai dû ajouter "'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock'" à config / database.php
Ángel Carlos del Pozo Muela

Bonjour la communauté, je reçois cette erreur même si je n'utilise pas laravel pouvez-vous regarder le problème ici c'est stackoverflow.com/questions/60796332/…
Kiran Patel

656

Laravel 4: changez "host" dans le app/config/database.phpfichier de "localhost" en "127.0.0.1"

Laravel 5: Changez "DB_HOST" dans le .envfichier de "localhost" en "127.0.0.1"

J'ai eu exactement le même problème. Aucune des solutions ci-dessus n'a fonctionné pour moi. J'ai résolu le problème en modifiant "l'hôte" dans le fichier /app/config/database.php de "localhost" en "127.0.0.1".

Je ne sais pas pourquoi "localhost" ne fonctionne pas par défaut, mais j'ai trouvé cette réponse dans une question similaire résolue dans un message symfony2. https://stackoverflow.com/a/9251924/1231563

Mise à jour: Certaines personnes ont demandé pourquoi ce correctif fonctionne, j'ai donc fait un peu de recherche sur le sujet. Il semble qu'ils utilisent différents types de connexion comme expliqué dans cet article https://stackoverflow.com/a/9715164/1231563

Le problème qui se pose ici est que "localhost" utilise un socket UNIX et ne peut pas trouver la base de données dans le répertoire standard. Cependant, "127.0.0.1" utilise TCP (Transmission Control Protocol), ce qui signifie qu'il passe essentiellement par "Internet local" sur votre ordinateur, étant beaucoup plus fiable que la prise UNIX dans ce cas.


3
étrange que ce soit la solution pour moi aussi, mais je peux me connecter depuis la ligne de commande avec mysql --host = localhost - qui fonctionne, mais pas depuis PDO.
John

26
J'aimerais savoir POURQUOI localhostne fonctionne pas et 127.0.0.1fonctionne ??
Justin

6
Cela a fonctionné pour moi sur un système MAMP exécutant un fichier php sur la ligne de commande (terminal). Cela a fonctionné comme une page Web, mais pas comme un fichier de ligne de commande jusqu'à ce que je change l'hôte local en '127.0.0.1'
Samuel Fullman

1
@Justin Je pense que c'est parce que localhost essaie d'utiliser le socket, alors que 127.0.0.1 utilise 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

J'ai le même problème et j'utilise Mac OS X 10.10 Yosemite. J'ai activé le serveur Apache et PHP qui est déjà fourni avec le système d'exploitation. Ensuite, je viens de configurer la bibliothèque mCrypt pour commencer. Après cela, lorsque je travaillais avec des modèles et DB, j'ai eu l'erreur:

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

La raison pour laquelle j'ai trouvé est juste parce que PHP et MySQL ne peuvent pas se connecter eux-mêmes. Pour résoudre ce problème, je procède comme suit:

  1. Ouvrez un terminal et connectez-vous à mysql avec:

    mysql -u root -p
  2. Il vous demandera le mot de passe associé. Ensuite, une fois que vous obtenez l'invite mysql, tapez la commande suivante:

    mysql> show variables like '%sock%'
  3. Vous obtiendrez quelque chose comme ceci:

    +-----------------------------------------+-----------------+
    | Variable_name                           | Value           |
    +-----------------------------------------+-----------------+
    | performance_schema_max_socket_classes   | 10              |
    | performance_schema_max_socket_instances | 322             |
    | socket                                  | /tmp/mysql.sock |
    +-----------------------------------------+-----------------+
    
  4. Conservez la valeur de la dernière ligne:

    /tmp/mysql.sock
  5. Dans votre laraveldossier de projet, recherchez le fichier database.php où vous configurez les paramètres de connexion DB. Dans la section mysql , ajoutez la ligne suivante à la fin:

    'unix_socket' => '/tmp/mysql.sock'
  6. Vous devez avoir quelque chose comme ça:

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

Maintenant, enregistrez simplement les modifications et rechargez la page et cela doit fonctionner!


3
La solution la plus "directe à émettre". Merci, cela m'a
permis de lancer

Merci pour cela. Cela a fonctionné pour moi. Utilisation d'OSX 10.10.5 MAMP Pro
marknt15

Cela a également fonctionné pour moi avec MAMP pro et OS X 10.11.x. A fini par être:/Applications/MAMP/tmp/mysql/mysql.sock
Plaque d'immatriculation Bort

1
+1. Utiliser "127.0.0.1" dans la configuration au lieu de "localhost" comme Yamartino l'a dit dans sa réponse fonctionne bien mais c'est plus rapide avec un socket et cette réponse résout le problème. C'est dommage que mysql traite "localhost" d'une manière si particulière quand unix_socket est défini ...
Shautieh

@GregFerrell Ouais c'est vrai mais bon ... J'espère que cela pourrait être utile
alexventuraio

51

J'ai rencontré l' [PDOException] SQLSTATE[HY000] [2002] No such file or directoryerreur pour une raison différente. Je venais de terminer la construction d'une toute nouvelle pile LAMP sur Ubuntu 12.04 avec Apache 2.4.7, PHP v5.5.10 et MySQL 5.6.16. J'ai déplacé mes sites et les ai mis à feu. Mais, je n'ai pas pu charger mon site basé sur Laravel 4.2.x à cause de ce qui [PDOException]précède. J'ai donc vérifié php -i | grep pdoet remarqué cette ligne:

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

Mais, dans mon /etc/my.cnf, le fichier de chaussette est en fait /var/run/mysqld/mysqld.sock.

J'ai donc ouvert mon php.ini et défini la valeur de pdo_mysql.default_socket:

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

Ensuite, j'ai redémarré apache et vérifié php -i | grep pdo:

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

Cela m'a arrangé.


C'était le correctif qui a fonctionné pour moi, le problème était que j'ai installé deux versions de mysql et en ai supprimé une, la modification 127.0.0.1 n'a pas fonctionné ou l'ajout de la chaussette dans la config, merci! @dcarrith
Luis

2
Cela m'a aidé à trouver mon problème - c'est que j'utilisais le php intégré OSX, pas le binaire php MAMP. Assurez-vous donc que vous utilisez la bonne version de php qui pointe vers le bon php.ini, etc. Définitivement "doh!" moment.
dragonflyesque

43

La réponse de @stuyam a résolu le problème "Aucun fichier ou répertoire de ce type" pour moi

Réponse courte: remplacez «hôte» dans le fichier /app/config/database.php par «localhost» par «127.0.0.1»

Mais j'ai eu une erreur "Connexion refusée". Si quelqu'un avait le même problème, ma solution était de mettre à jour le fichier app / config / local / database.php pour que le port soit 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
Dans mon cas, ça l'était 'port' => '33060'mais cette réponse m'a fait arriver là!
mopo922

26

Si vous utilisez Laravel Homestead, assurez-vous d'appeler les commandes sur le serveur.

homestead ssh

Ensuite, cd simplement dans le bon répertoire et lancez votre commande là-bas.


2
Cela a fonctionné, j'exécutais la commande depuis mon ordinateur au lieu de ssh dans VM en premier et j'y exécutais la commande.
cmac

J'oublie toujours cette étape. Il h. 1. source ~/.zshrc2. homestead up --provision3.homestead ssh
Marcel

1
vagrant sshdans mon cas
Marcos Curvello

22

Dans mon cas, je n'ai eu aucun problème, j'ai juste oublié de démarrer le service mysql ...

sudo service mysqld start

19

Option d'activation d'utilisateur Mamp Autoriser l'accès réseau à MYSQL

entrez la description de l'image ici


18

Ajoutez le chemin mysql.sock dans le fichier database.php comme dans l'exemple ci-dessous

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

Exemple

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

18

Il a travaillé après avoir changement de DB_HOST=localhostla DB_HOST=127.0.0.1au fichier .env


2
Cela a fonctionné, vous avez raison. Avez-vous des idées expliquant pourquoi localhostcela ne fonctionne pas?
Fusion

1
@Fusion si vous exécutez votre application dans un conteneur, elle comprendra «localhost» comme conteneur, 127.0.0.1 lui dit d'utiliser la base de données de l'hôte
deathemperor

J'ai également eu un tel problème, je n'ai pas pu vider le cache ou exécuter un service artisanal
Tom Mwenda

17

En effet, PDO traite spécialement l'hôte "localhost":

Remarque: Unix uniquement: lorsque le nom d'hôte est défini sur "localhost", la connexion au serveur est établie via une socket de domaine. Si PDO_MYSQL est compilé avec libmysqlclient, l'emplacement du fichier socket est à l'emplacement compilé dans libmysqlclient. Si PDO_MYSQL est compilé avec mysqlnd, un socket par défaut peut être défini via le paramètre pdo_mysql.default_socket.

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

Changer localhost en 127.0.0.1 "forcera" l'utilisation de TCP.

Remarque: mysqli_connect fonctionne bien avec localhost.


12

S'appuyant sur la réponse de @dcarrith ...

Au lieu de modifier les fichiers de configuration, j'ai créé un alias à l'emplacement recherché par PHP qui se connecte au vrai mysql.sock. ( source )

Exécutez simplement ces deux commandes (aucun redémarrage nécessaire):

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

11

Étape 1

Trouvez le chemin vers votre unix_socket, pour cela, lancez netstat -ln | grep mysql

Vous devriez obtenir quelque chose comme ça

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

Étape 2

Prenez cela et ajoutez dans votre unix_socket param

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

J'espère que ça aide !!


8

J'exécute sur MAMP Pro et j'ai eu ce problème similaire lors de la migration (créer des tables db). J'ai également essayé quelques-unes de ces suggestions, mais je ne l'ai pas fait pour moi.

Donc, simplement (après une heure de recherche sur Google), j'ai ajouté deux choses au fichier /config/database.php.

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

Fonctionne bien maintenant!


4

Vérifiez soigneusement votre port. Dans mon cas, c'était 8889 et j'utilise 8888. changez "DB_HOST" de "localhost" en "127.0.0.1" et vice versa


Super, merci, mon port était 3306 mais mon vrai port est 8889
David

4

J'ai eu ces problèmes lorsque j'exécutais mon application à l'aide de conteneurs Docker.

La solution a été mise le nom du conteneur de service MySQL que j'utilisais dans docker_compose.ymlDB_HOST. Dans mon cas, c'était db:

DB_HOST=db

J'espère que ça aide.


2

Depuis Laravel 5, le nom d'utilisateur et le mot de passe de la base de données vont dans le fichier .env qui existe dans le répertoire du projet, par exemple

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

Comme vous pouvez le voir, ces variables d'environnement remplacent les chaînes de forge ici, donc les modifier n'a aucun effet:

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

Plus d'informations sont ici https://mattstauffer.co/blog/laravel-5.0-environment-detection-and-environment-variables


2

J'ai rencontré ce problème lors de l'exécution de PHPUnit dans Elixir / Gulp et Homestead en tant que mon environnement Vagrant.

Dans mon cas , je modifié le fichier .env de DB_HOST=localhostà DB_HOST=192.168.10.10192.168.10.10est l'adresse IP de mon hôte Vagrant / Homestead.


2

Essayez de vous connecter à localhost:

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

Essayez de vous connecter à 127.0.0.1:

SQLSTATE[HY000] [2002] Connection refused

OK, il suffit de commenter / supprimer le paramètre suivant de my.cnf (sous OS X 10.5:) /opt/local/etc/mysqlxx/my.cnfpour obtenir:

[mysqld]
# skip-networking

Bien sûr, arrêtez et démarrez MySQL Server.


2

J'ai eu des problèmes similaires pour accéder à mon site Web Drupal. Je l'ai corrigé en ouvrant la ligne de commande et en redémarrant mon serveur ou service MySQL:

service mysqld restart

Cela devrait fonctionner. Si ce n'est pas le cas, redémarrez votre serveur Web local:

service httpd restart

Cela devrait suffire. J'espère que cela fonctionne aussi pour d'autres environnements. Notez que ces commandes nécessitent généralement des privilèges de superutilisateur.


1

Si vous utilisez Laravel Homestead, voici les paramètres

(inclure Vagrant-Virtual Machine)

.bash-profile

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

Si quelqu'un cherche toujours la réponse, vérifiez simplement votre fichier .env. Pour une raison quelconque, laravel a créé un fichier .env.example, donc toutes ces réponses n'ont pas fonctionné pour moi. J'ai résolu mon problème en renommant .env.example en .env


Il n'y a pas de réponse correcte unique à cette question car il existe une variété d'erreurs qui peuvent être faites. C'est l'un d'eux, tout comme le fait de ne pas copier le fichier .env sur un serveur distant. Il vaut donc la peine de vérifier le fichier .env sur le serveur sur lequel vous essayez d'exécuter la requête pour vous assurer qu'elle existe et contient les informations nécessaires pour établir une connexion.
petercoles

1

Cela m'est arrivé parce que MySQL ne fonctionnait pas. MySQL n'a pas pu démarrer car j'avais un /usr/local/etc/my.cnf.d/répertoire manquant .

Cela était requis par mon /usr/local/etc/my.cnffichier de configuration en tant que glob include ( include /usr/local/etc/my.cnf.d/*.cnf).

L'exécution mkdir /usr/local/etc/my.cnf.d, puis le démarrage de MySQL, ont résolu le problème.


1

Dans mon cas, j'utilisais php artisan migrate sur mon terminal mac, quand j'avais besoin de ssh dans vagrant et de le lancer à partir de là. J'espère que cela aide quelqu'un au mal de tête.


1

J'ai eu le même problème en utilisant Docker et le nom du service MySQL dbdans le fichier docker_compose.yml:

J'ai ajouté ce qui suit dans le .envfichier:

DB_HOST=db

vous devez également vous assurer que votre hôte est détectable à partir de l'application php.

C'est parce que PHP n'a pas trouvé l'hôte à utiliser pour se connecter.


0

Lorsque vous utilisez un VirtualMachine, assurez-vous que ssh dans cette machine et accédez à votre dossier App et appelez la commande php artisan migrate à partir de là.


0

Au cas où, j'aurais simplement utilisé

vagrant up

au lieu de

homestead up

pour ma configuration de larves de forge en utilisant la propriété familiale. Je suppose que cela signifiait que le site était servi, mais le serveur MySQL n'a jamais été démarré. Lorsque j'ai utilisé cette dernière commande pour lancer ma boîte vagabonde, l'erreur a disparu.


0

Toutes ces réponses semblent être lourdes ...

Je viens de créer un .envfichier; modifié mon bootstrap/app.phpfichier et commenté la ligne suivante ...

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

J'espère que cela aide quelqu'un


0

Pour toute personne essayant de créer une nouvelle connexion db non pas sur laravel mais bumped ici à la recherche de réponses pour exécuter PDO à partir du terminal. Ce serait utile pour vous. Et vous pouvez le refactoriser pour qu'il fonctionne le mieux pour vous.

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

} 

J'espère que ça aide!


0

Dans mon cas, j'ai dû supprimer le dossier bootstrap / cache et réessayer.

Mon cenario était après une migration de serveur.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.