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.

Daniel Hollands
la source
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 .

ukautz
la source
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.

stuyam
la source
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!

alexventuraio
la source
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é.

dcarrith
la source
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'    => '',
    ),
Marlow
la source
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.

Koen B.
la source
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
Carlos ABS
la source
19

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

entrez la description de l'image ici

George John
la source
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'),
RaviNila
la source
18

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

NuOne
la source
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.

Thomas Decaux
la source
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
Justin
la source
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 !!

cyber8200
la source
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!

anoraq
la source
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

Ahmed Awan
la source
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.

Lano
la source
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

malhal
la source
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.


la source
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.

Anna Logg
la source
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.

RAWGIT
la source
1

Si vous utilisez Laravel Homestead, voici les paramètres

(inclure Vagrant-Virtual Machine)

.bash-profile

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
la source
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

Alberto Alegria
la source
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.

james2doyle
la source
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.

Brad
la source
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.

Oscar David
la source
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à.

cmac
la source
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.

Ben Wilson
la source
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

MrMesees
la source
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!

Ifeanyi Amadi
la source
0

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

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

Raphael Cangucu
la source