PDOException SQLSTATE [HY000] [2002] Nessun file o directory


320

Credo di aver distribuito con successo il mio sito (molto semplice) su fortrabbit, ma non appena mi collego a SSH per eseguire alcuni comandi (come php artisan migrateo php artisan db:seed) ricevo un messaggio di errore:

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

Ad un certo punto la migrazione deve aver funzionato, perché le mie tabelle sono lì, ma questo non spiega perché non funzioni ora per me.



1
a volte solo perché non hai ancora installato mysql
Hassan Gilak,

Risposte:


142

Il messaggio di errore indica che è stata tentata una connessione MySQL tramite socket (che non è supportata).

Nel contesto di Laravel (artigiano), probabilmente si desidera utilizzare un ambiente diverso / corretto. Ad esempio: php artisan migrate --env=production(o qualunque ambiente). Vedi qui .


1
Questa è stata la soluzione al mio problema, uno degli sviluppatori della nostra azienda non utilizza Homestead e si collega a mysql tramite socket. Ho rimosso la configurazione del socket dal mio file app / database.php. Problema risolto
borislemke,

Ho dovuto solo abilitare l'estensione mysqli.so in php.ini
Mehulkumar,

4
Ho dovuto aggiungere "'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock'" a config / database.php
Ángel Carlos del Pozo Muela

ciao comunità, sto riscontrando questo errore anche se non sto usando laravel puoi guardare il problema qui è stackoverflow.com/questions/60796332/…
Kiran Patel

656

Laravel 4: Cambia "host" nel app/config/database.phpfile da "localhost" a "127.0.0.1"

Laravel 5: modifica "DB_HOST" nel .envfile da "localhost" a "127.0.0.1"

Ho avuto lo stesso identico problema. Nessuna delle soluzioni sopra ha funzionato per me. Ho risolto il problema modificando "host" nel file /app/config/database.php da "localhost" a "127.0.0.1".

Non so perché "localhost" non funzioni di default ma ho trovato questa risposta in una domanda simile risolta in un post di symfony2. https://stackoverflow.com/a/9251924/1231563

Aggiornamento: alcune persone hanno chiesto perché questa correzione funzioni, quindi ho fatto un po 'di ricerca sull'argomento. Sembra che utilizzino tipi di connessione diversi, come spiegato in questo post https://stackoverflow.com/a/9715164/1231563

Il problema che si è presentato qui è che "localhost" utilizza un socket UNIX e non riesce a trovare il database nella directory standard. Tuttavia, "127.0.0.1" utilizza TCP (Transmission Control Protocol), il che significa essenzialmente che passa attraverso "Internet locale" sul tuo computer, essendo molto più affidabile del socket UNIX in questo caso.


3
strano che fosse la soluzione anche per me, ma sono in grado di connettermi dalla riga di comando con mysql --host = localhost - che funziona, ma non da DOP.
John,

26
Mi piacerebbe sapere PERCHÉ localhostnon funziona e 127.0.0.1funziona ??
Giustino,

6
Questo ha funzionato per me su un sistema MAMP che esegue un file php sulla riga di comando (terminale). Funzionava come una pagina web, ma non come un file della riga di comando fino a quando non ho cambiato localhost in '127.0.0.1'
Samuel Fullman

1
@Justin Penso che sia perché localhost tenta di usare socket, mentre 127.0.0.1 usa 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

Ho avuto lo stesso problema e sto eseguendo Mac OS X 10.10 Yosemite. Ho abilitato Apache Server e PHP già forniti con il sistema operativo. Quindi ho appena configurato la libreria mCrypt per iniziare. Successivamente, quando stavo lavorando con modelli e DB ho ricevuto l'errore:

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

Il motivo che ho scoperto è solo perché PHP e MySQL non possono connettersi da soli. Per risolvere questo problema, seguo i passaggi seguenti:

  1. Apri un terminale e connettiti al mysql con:

    mysql -u root -p
  2. Ti chiederà la password relativa. Quindi, una volta ottenuto il prompt mysql, digitare il comando successivo:

    mysql> show variables like '%sock%'
  3. Otterrai qualcosa del genere:

    +-----------------------------------------+-----------------+
    | Variable_name                           | Value           |
    +-----------------------------------------+-----------------+
    | performance_schema_max_socket_classes   | 10              |
    | performance_schema_max_socket_instances | 322             |
    | socket                                  | /tmp/mysql.sock |
    +-----------------------------------------+-----------------+
    
  4. Mantieni il valore dell'ultima riga:

    /tmp/mysql.sock
  5. Nella laravelcartella del progetto, cerca il file database.php dove è possibile configurare i parametri di connessione al DB. Nella sezione mysql aggiungi la riga successiva alla fine:

    'unix_socket' => '/tmp/mysql.sock'
  6. Devi avere qualcosa del genere:

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

Ora basta salvare le modifiche e ricaricare la pagina e deve funzionare!


3
La soluzione più "semplice da emettere". Grazie, questo mi ha risolto a gestire Laravel con MAMP pro
animaacija il

Grazie per questo. Questo ha funzionato per me. Utilizzo di OSX 10.10.5 MAMP Pro
marknt15

Questo ha funzionato anche per me con MAMP pro e OS X 10.11.x. Finì per essere:/Applications/MAMP/tmp/mysql/mysql.sock
Bort License Plate

1
+1. L'uso di "127.0.0.1" nella configurazione invece di "localhost" come ha detto Yamartino nella sua risposta funziona bene ma è più veloce con un socket e questa risposta risolve il problema. È un peccato che mysql tratti "localhost" in un modo così particolare quando unix_socket è definito però ...
Shautieh,

@GregFerrell Sì, è vero, ma beh ... Spero possa essere utile
alexventuraio

51

Ho riscontrato l' [PDOException] SQLSTATE[HY000] [2002] No such file or directoryerrore per un motivo diverso. Avevo appena finito di costruire un nuovissimo stack LAMP su Ubuntu 12.04 con Apache 2.4.7, PHP v5.5.10 e MySQL 5.6.16. Ho spostato nuovamente i miei siti e li ho accesi. Ma non ho potuto caricare il mio sito basato su Laravel 4.2.x a causa di quanto [PDOException]sopra. Quindi, ho controllato php -i | grep pdoe notato questa riga:

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

Ma, nel mio /etc/my.cnf, il file sock si trova in realtà /var/run/mysqld/mysqld.sock.

Quindi, ho aperto il mio php.ini e impostato il valore per pdo_mysql.default_socket:

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

Quindi, ho riavviato apache e controllato php -i | grep pdo:

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

Ciò ha risolto il problema per me.


Questa è stata la correzione che ha funzionato per me, il problema era che ho installato due versioni di mysql e ne ho rimosso una, la modifica 127.0.0.1 non ha funzionato o l'aggiunta del calzino nella configurazione, grazie! @dcarrith
Luis,

2
Questo mi ha aiutato a trovare il mio problema - che era che stavo usando OSX in bundle php, non il binario MAMP php. Quindi assicurati di utilizzare la versione corretta di php che punta al php.ini corretto, ecc. "Doh!" momento.
libellula

43

La risposta di @stuyam ha risolto il problema "Nessun file o directory simile" per me

Risposta breve: modifica "host" nel file /app/config/database.php da "localhost" a "127.0.0.1"

Ma poi ho avuto un errore "Connessione rifiutata". Se qualcuno ha avuto lo stesso problema, la mia soluzione era aggiornare il file app / config / local / database.php in modo che la porta sia 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
Nel mio caso, è stato 'port' => '33060'ma questa risposta mi ha portato lì!
mopo922,

26

Se stai usando Laravel Homestead, assicurati di chiamare i comandi sul server.

homestead ssh

Quindi semplicemente cd nella directory giusta e lancia il tuo comando lì.


2
Questo ha funzionato, stavo eseguendo il comando dal mio computer anziché prima ssh nella VM e ho eseguito il comando lì.
cmac,

Dimentico sempre questo passaggio. Eh. 1. source ~/.zshrc2. homestead up --provision3.homestead ssh
Marcel

1
vagrant sshnel mio caso
Marcos Curvello,

22

Nel mio caso non ho avuto nessun problema, ho dimenticato di avviare il servizio mysql ...

sudo service mysqld start


18

Aggiungi il percorso mysql.sock nel file database.php come nell'esempio seguente

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

eample

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

18

Ha funzionato dopo che ho cambiamento da DB_HOST=localhosta DB_HOST=127.0.0.1a file di .env


2
Questo ha funzionato, hai ragione. Avete delle idee che spiegano il motivo per cui localhostnon funziona?
Fusion,

1
@Fusion se stai eseguendo la tua app all'interno di un contenitore capirà 'localhost' come contenitore, 127.0.0.1 le dice di usare il db
dell'host

Ho anche avuto un tale problema, non sono riuscito a svuotare la cache o eseguire il servizio artigianale
Tom Mwenda il

17

Questo perché PDO tratta in particolare l'host "localhost":

Nota: solo Unix: quando il nome host è impostato su "localhost", la connessione al server viene stabilita tramite un socket di dominio. Se PDO_MYSQL viene compilato su libmysqlclient, la posizione del file socket si trova nella posizione compilata di libmysqlclient. Se PDO_MYSQL viene compilato su mysqlnd, è possibile impostare un socket predefinito tramite l'impostazione pdo_mysql.default_socket.

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

La modifica di localhost in 127.0.0.1 "impone" l'uso di TCP.

Nota: mysqli_connect funziona correttamente con localhost.


12

Sulla base della risposta di @dcarrith ...

Invece di modificare i file di configurazione, ho creato un alias nella posizione che sta cercando PHP che si collega al vero mysql.sock. ( fonte )

Basta eseguire questi due comandi (non è necessario il riavvio):

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

11

Passo 1

Trova il percorso per unix_socket, per farlo basta eseguirlo netstat -ln | grep mysql

Dovresti ottenere qualcosa del genere

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

Passo 2

Prendi quello e aggiungilo nel tuo parametro unix_socket

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

Spero che sia d'aiuto !!


8

Sono in esecuzione su MAMP Pro e ho riscontrato questo problema simile quando provavo a migrare (creare tabelle db). Ho provato anche alcuni di questi suggerimenti, ma non l'ho fatto per me.

Quindi, semplicemente (dopo un'ora su Google), ho aggiunto due cose a /config/database.php.

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

Funziona bene ora!


4

Controlla attentamente la tua porta. Nel mio caso era 8889 e sto usando 8888. cambio "DB_HOST" da "localhost" a "127.0.0.1" e viceversa


Ottimo, grazie, il mio porto era il 3306 ma il mio vero porto è l'8889
David il

4

Ho avuto questi problemi quando stavo eseguendo la mia applicazione usando i contenitori docker.

Alla soluzione è stato inserito il nome del contenitore di servizi MySQL che stavo usando docker_compose.ymlsu DB_HOST. Nel mio caso, era db:

DB_HOST=db

Spero che sia d'aiuto.


2

A partire da Laravel 5 il nome utente e la password del database vengono inseriti nel file .env presente nella directory del progetto, ad es

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

Come puoi vedere, queste variabili di ambiente hanno la precedenza sulle stringhe "forge", quindi la loro modifica non ha alcun effetto:

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

Maggiori informazioni qui https://mattstauffer.co/blog/laravel-5.0-environment-detection-and-environment-variables


2

Ho riscontrato questo problema durante l'esecuzione di PHPUnit in Elixir / Gulp e Homestead come il mio ambiente Vagrant.

Nel mio caso ho modificato il file .env da DB_HOST=localhosta DB_HOST=192.168.10.10dove 192.168.10.10è l'IP del mio ospite Vagrant / Homestead.


2

Tentativo di connettersi a localhost:

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

Tentativo di connessione a 127.0.0.1:

SQLSTATE[HY000] [2002] Connection refused

OK, basta commentare / rimuovere la seguente impostazione da my.cnf (su OS X 10.5:) /opt/local/etc/mysqlxx/my.cnfper ottenere:

[mysqld]
# skip-networking

Naturalmente, arrestare e avviare MySQL Server.


2

Ho avuto problemi simili durante l'accesso al mio sito Web Drupal. L'ho risolto aprendo la riga di comando e riavviando il mio server o servizio MySQL:

service mysqld restart

Questo dovrebbe funzionare. In caso contrario, riavvia il server web locale:

service httpd restart

Questo dovrebbe essere abbastanza. Spero che funzioni anche per altri ambienti. Si noti che questi comandi richiedono generalmente i privilegi di superutente.


1

Se stai usando Laravel Homestead, ecco le impostazioni

(include Vagrant-Virtual Machine)

.bash-profilo

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

terminale

vm

vagrant@homestead:~/Code/projectFolder  php artisan migrate:install

1

Se qualcuno sta ancora cercando la risposta, controlla il tuo file .env. Per qualche ragione laravel crea un file .env.example, quindi tutte queste risposte non hanno funzionato per me. Ho risolto il problema rinominando .env.example in .env


Non esiste un'unica risposta corretta a questa domanda in quanto è possibile commettere una varietà di errori. Questo è uno di questi, poiché non è possibile copiare il file .env su un server remoto. Quindi vale la pena controllare il file .env sul server in cui si sta tentando di eseguire la query per assicurarsi che sia esistente e contenga le informazioni necessarie per stabilire una connessione.
petercole,

1

Questo mi è successo perché MySQL non era in esecuzione. MySQL non si avviava perché avevo una /usr/local/etc/my.cnf.d/directory mancante .

Questo è stato richiesto dal mio /usr/local/etc/my.cnffile di configurazione come glob include ( include /usr/local/etc/my.cnf.d/*.cnf).

L'esecuzione mkdir /usr/local/etc/my.cnf.de quindi l'avvio di MySQL hanno risolto il problema.


1

Nel mio caso, stavo eseguendo php artisan migrare sul mio terminale mac, quando avevo bisogno di ssh in vagabondo ed eseguirlo da lì. Spero che aiuti qualcuno a soffrire di mal di testa.


1

Ho avuto lo stesso problema utilizzando Docker e il nome del servizio MySQL dbnel file docker_compose.yml:

Ho aggiunto quanto segue nel .envfile:

DB_HOST=db

dovresti anche assicurarti che il tuo host sia rilevabile dall'app php.

È perché PHP non ha capito quale host utilizzare per connettersi.


0

Quando usi una VirtualMachine, assicurati di accedere a quella macchina e di navigare nella cartella della tua app e di chiamare il comando php artisan migrate da lì.


0

In ogni caso, avrei semplicemente usato

vagrant up

invece di

homestead up

per la mia configurazione larvale forgia usando la fattoria. Suppongo che ciò significasse che il sito veniva servito, ma il server MySQL non è mai stato avviato. Quando ho usato quest'ultimo comando per avviare il mio vagabondo, l'errore è scomparso.


0

Tutte queste risposte sembrano un sollevamento pesante ...

Ho appena creato un .envfile; modificato il mio bootstrap/app.phpfile e decommentato la seguente riga ...

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

Spero che questo aiuti qualcuno


0

Per chiunque cerchi di creare una nuova connessione db non su laravel ma si è imbattuto qui alla ricerca di risposte per eseguire PDO dal Terminale. Questo ti sarebbe di aiuto. E puoi refattarlo per funzionare meglio per te.

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

} 

spero che sia d'aiuto!


0

Nel mio caso ho dovuto rimuovere la cartella bootstrap / cache e riprovare.

Il mio cenario era dopo una migrazione del server.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.