web-dev-qa-db-fra.com

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

Je crois que j'ai déployé avec succès mon site (très basique) sur fortrabbit, mais dès que je me connecte à SSH pour exécuter certaines commandes (telles que php artisan migrate ou php artisan db:seed), un message d'erreur s'affiche:

[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.

258
Daniel Hollands

Le message d'erreur indique qu'une connexion MySQL via socket est essayée (ce qui n'est pas supporté).

Dans le contexte de Laravel (artisan), vous souhaiterez probablement utiliser un environnement différent/correct. Par exemple: php artisan migrate --env=production (ou quel que soit l'environnement). Voir ici .

119
ukautz

Laravel 4: Remplacez "hôte" dans le fichier app/config/database.php de "localhost" par "127.0.0.1"

Laravel 5: Remplacez "DB_Host" dans le fichier .env de "localhost" par "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 remplaçant "localhost" par "127.0.0.1" dans le fichier /app/config/database.php du fichier "hôte".

Vous ne savez pas pourquoi "localhost" ne fonctionne pas par défaut mais j'ai trouvé cette réponse dans une question similaire résolue dans un post de symfony2. https://stackoverflow.com/a/9251924/123156

Mise à jour: Certaines personnes ont demandé pourquoi ce correctif fonctionnait. 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/123156

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 (protocole de contrôle de transmission), ce qui signifie essentiellement qu'il utilise "l'internet local" sur votre ordinateur et qu'il est beaucoup plus fiable que le socket UNIX dans ce cas.

587
stuyam

J'ai le même problème et j'utilise Mac OS X 10.10 Yosemite. J'ai activé le serveur Apache et PHP déjà fournis 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 des bases de données, j'ai eu l'erreur:

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

La raison pour laquelle j’ai trouvé cela vient simplement du fait que PHP et MySQL ne peuvent pas se connecter eux-mêmes. Pour résoudre ce problème, je suis les prochaines étapes:

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

    mysql -u root -p
    
  2. Il vous demandera le mot de passe associé. Puis, une fois que vous avez obtenu le mot de passe 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 dossier de projet laravel, recherchez le fichier database.php où vous configurez la connexion à la base de données. paramètres. 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 les modifications et rechargez la page et cela doit fonctionner!

80
Alex Ventura

J'ai rencontré l'erreur [PDOException] SQLSTATE[HY000] [2002] No such file or directory pour une raison différente. Je venais de terminer la construction d'une nouvelle pile LAMP sous Ubuntu 12.04 avec Apache 2.4.7, PHP v5.5.10 et MySQL 5.6.16. J'ai déplacé mes sites vers le haut et les ai tirés. Mais, je ne pouvais pas charger mon site basé sur Laravel 4.2.x en raison du [PDOException] ci-dessus. Donc, j'ai vérifié php -i | grep pdo et remarqué cette ligne:

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

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

J'ai donc ouvert mon fichier php.ini et défini la valeur pour 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 a réglé le problème pour moi.

45
dcarrith

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

Réponse courte: remplacez "localhost" par "127.0.0.1" dans le fichier /app/config/database.php.

Mais ensuite, j'ai eu une erreur "Connexion refusée". Si quelqu'un avait le même problème, ma solution consistait à mettre à jour le fichier app/config/local/database.php de sorte 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'    => '',
    ),
40
Marlow

Si vous utilisez Laravel Homestead, assurez-vous que vous appelez les commandes sur le serveur.

Homestead ssh

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

24
Koen B.

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

Sudo service mysqld start
17
Carlos ABS

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

enter image description here

16
George John

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

Cela a fonctionné après que je passe de DB_Host=localhost à DB_Host=127.0.0.1 dans le fichier .env.

13
NuOne

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 un socket de domaine. Si PDO_MYSQL est compilé avec libmysqlclient, l'emplacement du fichier de socket est celui de 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.

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

Le changement de localhost en 127.0.0.1 "forcera" l'utilisation de TCP.

Note: mysqli_connect fonctionne bien avec localhost.

13
Thomas Decaux

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 )

Il suffit d’exécuter ces deux commandes (aucun redémarrage requis):

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

Étape 1

Trouvez le chemin de votre unix_socket, pour cela, lancez simplement 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-le dans votre nix_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 !!

10
kyo

J'utilise MAMP Pro et j'ai eu ce problème similaire lors de la migration (créer des tables de base de données). J'ai essayé quelques-unes de ces suggestions, mais ne les a pas faites pour moi.

Donc, simplement (après une heure à googler), j’ai ajouté deux choses au fichier /config/database.php.

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

Fonctionne bien maintenant!

7
anoraq

Vérifiez votre port soigneusement. Dans mon cas, il s’agissait de 8889 et j’utilise 8888. changez "DB_Host" de "localhost" en "127.0.0.1" et inversement

3
Ahmed Awan

À partir de Laravel 5, le nom d'utilisateur et le mot de passe de la base de données sont enregistrés dans le fichier .env existant 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 constater, ces variables d’environnement remplacent les chaînes de "forge". Par conséquent, leur modification 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
malhal

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, commentez/supprimez le paramètre suivant de my.cnf (sous OS X 10.5: /opt/local/etc/mysqlxx/my.cnf) pour obtenir:

[mysqld]
# skip-networking

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

2
Anna Logg

J'ai rencontré ce problème lorsque j'utilisais PHPUnit dans Elixir/Gulp et que Homestead était mon environnement vagabond.

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

2
user5373314

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
1
ErcanE

Si quelqu'un cherche toujours la réponse, vérifiez simplement votre fichier .env. Pour une raison quelconque, laravel crée un fichier .env.example, ainsi toutes les réponses ne fonctionnent pas pour moi. J'ai résolu mon problème en renommant .env.example en .env

1
Alberto Alegria

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 services MySQL que j'utilisais dans docker_compose.yml sur DB_Host. Dans mon cas, c'était db:

DB_Host=db

J'espère que ça aide.

1
Lano

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 marcher. 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
RAWGIT

Cela m'est arrivé parce que MySQL ne fonctionnait pas. MySQL ne parvenait pas à démarrer car il me manquait un répertoire /usr/local/etc/my.cnf.d/.

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

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

1
james2doyle

Dans mon cas, je courais php artisan migrer sur mon terminal mac, quand j'ai eu besoin de ssh en vagrant et de l'exécuter à partir de là. J'espère que cela aide quelqu'un à avoir mal à la tête.

1
Brad

Lorsque vous utilisez une machine virtuelle, assurez-vous de ssh sur cette machine, accédez à votre dossier App et appelez la commande php artisan migrate à partir de là.

0
cmac

Dans le cas où je l'aurais simplement utilisé

vagrant up

au lieu de

Homestead up

pour ma configuration larvaire de forge en utilisant Homestead. Je suppose que cela signifiait que le site était desservi, mais que le serveur MySQL n'était jamais démarré. Lorsque j'ai utilisé cette dernière commande pour lancer ma boîte de vagabond, l'erreur a disparu.

0
Ben Wilson

Toutes ces réponses semblent être très lourdes ...

Je viens de créer un fichier .env; édité mon fichier bootstrap/app.php et enlevé la ligne suivante ...

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

J'espère que cela aide quelqu'un

0
MrMesees

Dans mon cas, j'ai dû supprimer le dossier bootstrap/cache et l'essayer à nouveau.

Mon cénario était après une migration de serveur.

0
Raphael Cangucu

Pour tous ceux qui essaient de créer une nouvelle connexion à la base de données, pas sur laravel, mais heurté ici à la recherche de réponses pour exécuter PDO à partir du terminal. Cela vous aiderait. Et vous pouvez le restructurer 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
Ifeanyi Amadi