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.
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 .
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.
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:
Ouvrez un terminal et connectez-vous au mysql avec:
mysql -u root -p
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%'
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 |
+-----------------------------------------+-----------------+
Conservez la valeur de la dernière ligne:
/tmp/mysql.sock
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'
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!
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.
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' => '',
),
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.
Dans mon cas, je n'ai eu aucun problème, j'ai juste oublié de démarrer le service mysql ...
Sudo service mysqld start
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'),
Cela a fonctionné après que je passe de DB_Host=localhost
à DB_Host=127.0.0.1
dans le fichier .env.
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.
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
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
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 !!
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!
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
À 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
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.
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.10
où 192.168.10.10
est l'adresse IP de mon hôte Vagrant/Homestead.
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
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
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.
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.
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.
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.
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à.
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.
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
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.
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!