Avviso: mysql_connect (): [2002] Nessun file o directory (tentando di connettersi tramite unix: ///tmp/mysql.sock) in


246

Sto cercando di connettermi al mio database MySQL con il terminale sulla mia Apple (con PHP).

Ieri ha funzionato bene, e ora ho improvvisamente l'errore nel titolo.

Lo script funziona quando uso il mio browser per eseguirlo (ho XAMPP installato), ma Terminal si rifiuta di connettersi al DB.

Ecco il file che includo per connettersi (lo script funziona quando non lo includo, ma non si collega al DB):

<?php
    mysql_connect("localhost", "root", "") or die(mysql_error());
    mysql_select_db("FNB1C_data") or die(mysql_error());
?>

Dovrebbe funzionare, dal momento che funziona con il mio browser.

Il comando che uso al Terminale è php scriptname.php.

Risposte:


415

Per qualche motivo mysql su OS X ha un po 'sbagliato l'ubicazione del file socket richiesto, ma per fortuna la soluzione è semplice come impostare un collegamento simbolico.

Potresti avere un socket (che appare come un file di lunghezza zero) come /tmp/mysql.socko /var/mysql/mysql.sock, ma una o più app lo stanno cercando nell'altra posizione. Scoprilo con questo comando:

ls -l /tmp/mysql.sock /var/mysql/mysql.sock

Invece di spostare il socket, modificare i file di configurazione e ricordare di mantenere i file modificati locali e lontani dai server in cui i percorsi sono corretti, è sufficiente creare un collegamento simbolico in modo che il Mac trovi il socket richiesto, anche quando si trova nel posto sbagliato !

Se hai /tmp/mysql.sockma no /var/mysql/mysql.sockallora ...

cd /var 
sudo mkdir mysql
sudo chmod 755 mysql
cd mysql
sudo ln -s /tmp/mysql.sock mysql.sock

Se hai /var/mysql/mysql.sockma no /tmp/mysql.sockallora ...

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

Avrai bisogno delle autorizzazioni per creare la directory e il link, quindi aggiungi i comandi sopra con sudo se necessario.


Buona risposta. Fix ha funzionato per me. Sai perché potrebbe funzionare una volta e poi non funzionare di nuovo? Ho avuto lo stesso problema.
Nicole,

16
Questo è piuttosto confuso. Consiglio vivamente la risposta di @luismreis per aggirare quel collegamento nascosto di MySQL.
MattiSG,

2
Non ha funzionato per me ... Non ho nessuno di quei file. Ma la risposta del luismreis ha funzionato!
Gregoire,

4
Questo non è "hacky". È il modo corretto di far funzionare il localhostsocket e può essere importante se non si desidera che l'overhead aggiuntivo invii pacchetti al router prima dell'accesso al database.
Kebman,

1
Il percorso sul mio Ubuntu 10.04 non era corretto. Ho dovuto fare questo: cd /tmpe poi:sudo ln -s /var/run/mysqld/mysqld.sock mysql.sock .
franzlorenzon,

371

Ho anche avuto questo errore, ma ho potuto risolverlo solo attraverso il suggerimento qui .

Per riassumere, utilizzare:

127.0.0.1

Invece di:

localhost

Il motivo è che "localhost" è un nome speciale per il driver MySQL che lo fa utilizzare il socket UNIX per connettersi a MySQL anziché un socket TCP.


1
Se funziona, controlla il tuo hostsfile, potrebbe essere mancante o incasinato
Fabrizio

3
forse anche buono da menzionare: quando usi MAMP come me devi deselezionare la casella "Consenti solo accesso locale"
soupdiver

Questa soluzione comporta un sovraccarico aggiuntivo poiché il pacchetto viene inviato per primo dal router. Di solito non è un grosso problema durante il test, ma può diventare un problema con grandi pacchetti di dati.
Kebman,

3
@Fabrizio No, non è collegato. Quando si utilizza localhost come nome, mysql utilizzerà invece un socket Unix che viene gestito tramite una voce di file (mysql.sock, ad esempio), non Inet, indipendentemente dal fatto che localhost sia dichiarato in / etc / hosts o meno. Tuttavia, quando si utilizza un indirizzo IP, anche 127.0.0.1, si forza mysql ad aprire un socket Inet.
Fran Marzoa,

1
Ciò implica quindi che tutte le sovvenzioni fornite sul database MySQL a "user"% "localhost" non funzioneranno?
Polpo,

24

Stavo avendo lo stesso problema ed è così che l'ho risolto:

Ho avuto questo e non ha funzionato:

$con = mysql_connect('localhost', 'root', '1234');

L'ho fatto e ha funzionato:

$con = mysql_connect(':/Applications/MAMP/tmp/mysql/mysql.sock', 'root', '1234');

Invece di utilizzare il server mysql, mi sono collegato direttamente a Unix Socket. Ha funzionato per me.


Questa è l'unica soluzione che ha funzionato anche per me. Non ho un /var/mysql/mysql.sock. E non ho un /tmp/mysql.sock.
JeffB6688,

hai provato 127.0.0.1 invece di localhost?
Mantisse,

21

Il socket MySQL si trova, in generale, in /tmp/mysql.socko /var/mysql/mysql.sock, ma probabilmente PHP sembra nel posto sbagliato.

  1. Verifica dove si trova la tua presa con:

     sudo /usr/libexec/locate.updatedb
  2. Al termine dell'aggiornamentob:

     locate mysql.sock
  3. Quindi individuare php.ini:

     php -i | grep php.ini

    questo produrrà qualcosa del tipo:

     Configuration File (php.ini) Path => /opt/local/etc/php54
     Loaded Configuration File => /opt/local/etc/php54/php.ini
  4. Modifica il tuo php.ini

     sudo vim /opt/local/etc/php54/php.ini
  5. Cambia le linee:

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

    dove /tmp/mysql.sock è il percorso del tuo socket.

  6. Salvare le modifiche e uscire da ESC + MAIUSC: x

  7. Riavvia Apache

     sudo apachectl stop
     sudo apachectl start

Non ho un php.ini; Ho solo un php.ini.default, quindi sembra che la soluzione qui sia necessaria: apple.stackexchange.com/questions/65802/… Tuttavia, non ha funzionato per me.
user124384

@ user124384 L'installazione è probabilmente rotta: rinominare la php.ini.defaulta php.ini.
sostantivo

Apache può essere riavviato con una sola riga:sudo apachectl restart
fbiazi,

11

Sono su XAMPP su Mac OS X e la soluzione di Brian Lowe sopra ha funzionato con una leggera modifica .

Il file mysql.sock si trova effettivamente nella cartella "/ Applications / xampp / xamppfiles / var / mysql /". Quindi ho dovuto collegarlo sia in / tmp che in / var / mysql. Non ho verificato quale sia usato dalla riga di comando di PHP, ma questo ha fatto la correzione, quindi sono felice :-)

sudo su
ln -s /Applications/xampp/xamppfiles/var/mysql/mysql.sock /tmp/mysql.sock
mkdir /var/mysql
ln -s /Applications/xampp/xamppfiles/var/mysql/mysql.sock /var/mysql/mysql.sock

1
ty - Ho cercato una soluzione in pochi giorni e questa è quella che finalmente ha reso le cose giuste! =) XAMPP anche su OS X
ljubiccica

10

Mac OS X EL Capitan + MAMP Pro Fai questo

cd /var
sudo mkdir mysql
sudo chmod 755 mysql
cd mysql
sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock mysql.sock

Quindi fai questo

cd /tmp
sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock mysql.sock

Spero che questo ti faccia risparmiare un po 'di tempo.


Sta collegando il mysql.dockin quello /tmpche l'ha risolto. Grazie!
Mohammed J. Razem,

6

Il motivo è che php non riesce a trovare il percorso corretto di mysql.sock.

Assicurati che il tuo mysql sia in esecuzione per primo.

Quindi, si prega di confermare che quale percorso è il mysql.sock situato, per esempio/tmp/mysql.sock

quindi aggiungi questa stringa di percorso a php.ini:

  • mysql.default_socket = /tmp/mysql.sock
  • mysqli.default_socket = /tmp/mysql.sock
  • pdo_mysql.default_socket = /tmp/mysql.sock

Infine, riavvia Apache.


6

Quando affronti il ​​seguente problema:

Errore di lancio di PHP "Avviso: mysql_connect () http: //function.mysql-connect : 2002 Nessun file o directory (tentando di connettersi tramite unix: ///tmp/mysql.sock)"

Impostare il valore "mysql.default_socket" in /etc/php.inito

 "mysql.default_socket = /var/mysql/mysql.sock". 

Quindi riavviare il servizio Web nell'amministratore del server


Questa è stata la risposta migliore per me - nel mio caso sto usando MAMP, ho aggiunto al mio php.ini: mysqli.default_socket = /Applications/MAMP/tmp/mysql/mysql.sock mysql.default_socket = / Applications / MAMP / tmp /mysql/mysql.sock
Adamski il


1

Un'altra soluzione è correggere la posizione del socket nel file di configurazione php.ini in questo modo:

pdo_mysql.default_socket=/tmp/mysql.sock

Naturalmente, anche il collegamento simbolico funziona, quindi è una questione di preferenza quale si cambia.


1

Quando si installa php53-mysql utilizzando la porta, viene restituito il seguente messaggio che rappresenta la soluzione a questo problema:

To use mysqlnd with a local MySQL server, edit /opt/local/etc/php53/php.ini
and set mysql.default_socket, mysqli.default_socket and
pdo_mysql.default_socket to the path to your MySQL server's socket file.

For mysql5, use /opt/local/var/run/mysql5/mysqld.sock
For mysql51, use /opt/local/var/run/mysql51/mysqld.sock
For mysql55, use /opt/local/var/run/mysql55/mysqld.sock
For mariadb, use /opt/local/var/run/mariadb/mysqld.sock
For percona, use /opt/local/var/run/percona/mysqld.sock

Sto usando Mountain Lion e ho installato MySQL usando macports.
Sheric,

1

stavo avendo lo stesso problema

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

[ErrorException] Avviso: PDO :: __ construct (): [2002] Nessun file o directory (tentando di connettersi tramite unix: ///var/mysql/mysql.sock) in… htdocs / Symfony / vendor / doctrine-dbal / lib / doctrine / DBAL / driver / PDOConnection.php

Quindi la soluzione è creare un collegamento simbolico al file di calza risolvendo così il problema. Procedi come segue per risolverlo:

$ sudo mkdir / private / var / mysql /

$ sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock /private/var/mysql/mysql.sock

fonte: http://www.reecefowell.com/2012/07/21/symfony2-cli-does-not-connect-to-mysql-while-browser-works-fine/


Pubblica qui la tua risposta, piuttosto che un link a un sito Web esterno.
ElmerCat,

0

Ho avuto gli stessi errori. Mysql era in esecuzione come applicazione autonoma prima di avviare phpMyAdmin.

Ho appena smesso di mysql Quindi sudo / Applicazioni / XAMPP / xamppfiles / xampp stop sudo / Applicazioni / XAMPP / xamppfiles / xampp start

Ha funzionato bene


0

Ho appena avuto questo problema, ma è apparso solo durante il caricamento di alcune pagine (altre pagine hanno funzionato bene). Si è scoperto che stavo facendo chiamate a MySQL dopo aver chiuso la connessione mysql_close(). Quindi, come ha detto @brucenan: assicurati che MySQL sia in esecuzione quando lo chiami .


0

Puoi farlo semplicemente alias il MAMP php sul terminale Apple:

alias phpmamp='/Applications/MAMP/bin/php/php7.0.0/bin/php'

Esempio: > phpmamp - v

Ora puoi eseguire qualcosa del tipo: > phpmamp scriptname.php

Nota: questo verrà applicato solo per la sessione terminale corrente.


0

Dal momento che potresti usare MAMP, cambia la tua porta sul 3306 predefinito o usa 127.0.0.1 nel database.php

$db['default'] = array(
    'dsn'   => '',
    'hostname' => 'localhost',// leave it for port 3306
    'username' => 'yourUserhere',
    'password' => 'yourPassword',
    'database' => 'yourDatabase',
    'dbdriver' => 'mysqli',
    'dbprefix' => '',
    'pconnect' => FALSE,
    'db_debug' => (ENVIRONMENT !== 'production'),
    'cache_on' => FALSE,
    'cachedir' => '',
    'char_set' => 'utf8',
    'dbcollat' => 'utf8_general_ci',
    'swap_pre' => '',
    'encrypt' => FALSE,
    'compress' => FALSE,
    'stricton' => FALSE,
    'failover' => array(),
    'save_queries' => TRUE
);

O con le impostazioni predefinite:

$db['default'] = array(
        'dsn'   => '',
        'hostname' => '127.0.0.1:8889',// leave it for port 8889
        'username' => 'yourUserhere',
        'password' => 'yourPassword',
        'database' => 'yourDatabase',
        'dbdriver' => 'mysqli',
        'dbprefix' => '',
        'pconnect' => FALSE,
        'db_debug' => (ENVIRONMENT !== 'production'),
        'cache_on' => FALSE,
        'cachedir' => '',
        'char_set' => 'utf8',
        'dbcollat' => 'utf8_general_ci',
        'swap_pre' => '',
        'encrypt' => FALSE,
        'compress' => FALSE,
        'stricton' => FALSE,
        'failover' => array(),
        'save_queries' => TRUE
    );

0

Per impostazione predefinita, il client mySQL tenta di connettersi tramite un file locale chiamato socket anziché connettersi all'indirizzo di loopback (127.0.0.1) per localhost.

Il percorso predefinito di questo file socket, almeno su OSX, è /tmp/mysql.sock.

SOLUZIONE RAPIDA, MENO ELEGANTE

Creare un collegamento simbolico per ingannare il sistema operativo nella ricerca del socket corretto.

ln -s /Applications/MAMP/tmp/mysql/mysql.sock /tmp

SOLUZIONE CORRETTA

Modificare il percorso del socket definito nel startMysql.shfile in /Applications/MAMP/bin.

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.