Peringatan: mysql_connect (): [2002] Tidak ada file atau direktori tersebut (mencoba terhubung melalui unix: ///tmp/mysql.sock) di

246

Saya mencoba untuk terhubung ke MySQL DB saya dengan Terminal di Apple saya (Dengan PHP).

Kemarin bekerja dengan baik, dan sekarang saya tiba-tiba mendapatkan kesalahan dalam judul.

Script berfungsi ketika saya menggunakan browser saya untuk menjalankannya (saya telah menginstal XAMPP), tetapi Terminal menolak untuk terhubung ke DB.

Berikut adalah file yang saya sertakan untuk terhubung (skrip berfungsi ketika saya tidak menyertakan ini, tetapi kemudian tidak terhubung ke DB):

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

Itu seharusnya berfungsi, karena itu berfungsi dengan browser saya.

Perintah yang saya gunakan di Terminal adalah php scriptname.php.

No. 28
sumber

Jawaban:

415

Untuk beberapa alasan mysql pada OS X mendapatkan lokasi file soket yang diperlukan sedikit salah, tetapi untungnya solusinya sesederhana mengatur tautan simbolik.

Anda mungkin memiliki soket (muncul sebagai file dengan panjang nol) sebagai /tmp/mysql.sockatau /var/mysql/mysql.sock, tetapi satu atau lebih aplikasi mencari di lokasi lain untuk itu. Cari tahu dengan perintah ini:

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

Daripada memindahkan soket, mengedit file konfigurasi, dan harus ingat untuk menjaga file yang diedit lokal dan jauh dari server di mana jalurnya benar, cukup buat tautan simbolis sehingga Mac Anda menemukan soket yang diperlukan, bahkan ketika itu mencari di tempat yang salah !

Jika Anda memiliki /tmp/mysql.socktetapi tidak /var/mysql/mysql.sockmaka ...

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

Jika Anda memiliki /var/mysql/mysql.socktetapi tidak /tmp/mysql.sockmaka ...

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

Anda akan memerlukan izin untuk membuat direktori dan tautan, jadi awali saja perintah di atas dengan sudo jika perlu.

Brian Lowe
sumber
Jawaban yang bagus. Perbaiki berhasil untuk saya. Apakah Anda tahu mengapa itu bisa berfungsi sekali dan kemudian tidak berfungsi lagi? Saya memiliki masalah yang sama.
Nicole
16
Ini agak berantakan. Saya lebih merekomendasikan jawaban @luismreis untuk mengatasi pintasan tersembunyi MySQL.
MattiSG
2
Tidak berfungsi untuk saya ... Saya belum punya file-file itu. Tapi jawaban luismreis berhasil!
Gregoire
4
Ini bukan "retas". Ini adalah cara yang benar untuk membuat localhostsoket berfungsi, dan mungkin penting jika Anda tidak ingin overhead tambahan mengirim paket ke router sebelum database diakses.
Kebman
1
Jalur di Ubuntu 10,04 saya tidak benar. Aku harus melakukan ini: cd /tmpdan kemudian: sudo ln -s /var/run/mysqld/mysqld.sock mysql.sock.
franzlorenzon
371

Saya juga memiliki kesalahan ini, tetapi hanya bisa memperbaikinya melalui saran di sini .

Untuk meringkas, gunakan:

127.0.0.1

Dari pada:

localhost

Alasannya adalah bahwa "localhost" adalah nama khusus untuk driver MySQL yang membuatnya menggunakan soket UNIX untuk terhubung ke MySQL, bukan soket TCP.

luismreis
sumber
1
Jika ini berhasil, maka periksa hostsfile Anda , mungkin ada yang hilang atau kacau
Fabrizio
3
juga mungkin baik untuk disebutkan: Saat menggunakan MAMP seperti saya, Anda harus menghapus centang pada kotak "Izinkan akses lokal saja"
soupdiver
Solusi ini menghasilkan overhead tambahan saat paket dikirim oleh router terlebih dahulu. Biasanya bukan masalah besar saat pengujian, tetapi mungkin menjadi masalah dengan paket data yang besar.
Kebman
3
@ Fabrizio Tidak, ini tidak terkait. Ketika Anda menggunakan localhost sebagai nama, mysql akan menggunakan soket Unix sebagai gantinya yang ditangani melalui entri file (mysql.sock, misalnya), bukan Inet, tidak masalah apakah localhost dinyatakan di / etc / hosts atau tidak. Namun, ketika Anda menggunakan alamat ip sebagai gantinya, bahkan 127.0.0.1, Anda memaksa mysql untuk membuka soket Inet sebagai gantinya.
Fran Marzoa
1
Apakah ini kemudian, menyiratkan bahwa semua hibah yang Anda berikan di MySQL db ke 'pengguna'% 'localhost' akan rusak?
Octopus
24

Saya mengalami masalah yang sama dan ini adalah bagaimana saya memperbaikinya:

Saya punya ini dan tidak berhasil:

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

Saya melakukan ini dan berhasil:

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

Alih-alih menggunakan server mysql, saya terhubung langsung ke Unix Socket. Bekerja untukku.

Caio
sumber
Ini adalah satu-satunya solusi yang bekerja untuk saya juga. Saya tidak punya /var/mysql/mysql.sock. Dan saya tidak punya /tmp/mysql.sock.
JeffB6688
apakah Anda mencoba 127.0.0.1 bukan localhost?
Mantisse
21

Soket MySQL terletak, secara umum, di /tmp/mysql.sockatau /var/mysql/mysql.sock, tetapi mungkin PHP terlihat di tempat yang salah.

  1. Periksa di mana soket Anda dengan:

     sudo /usr/libexec/locate.updatedb
  2. Ketika pemutakhiran dihentikan:

     locate mysql.sock
  3. Kemudian cari php.ini Anda:

     php -i | grep php.ini

    ini akan menampilkan sesuatu seperti:

     Configuration File (php.ini) Path => /opt/local/etc/php54
     Loaded Configuration File => /opt/local/etc/php54/php.ini
  4. Edit php.ini Anda

     sudo vim /opt/local/etc/php54/php.ini
  5. Ubah garis:

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

    di mana /tmp/mysql.sock adalah jalur ke soket Anda.

  6. Simpan modifikasi Anda dan keluar dari ESC + SHIFT: x

  7. Mulai ulang Apache

     sudo apachectl stop
     sudo apachectl start
kata benda
sumber
Saya tidak punya php.ini; Saya hanya punya php.ini.default, jadi sepertinya solusi di sini diperlukan: apple.stackexchange.com/questions/65802/… Namun, itu tidak bekerja untuk saya.
user124384
@ user124384 Instalasi Anda mungkin rusak: ganti nama Anda php.ini.defaultmenjadi php.ini.
kata benda
Apache dapat dimulai kembali dengan satu baris:sudo apachectl restart
fbiazi
11

Saya menggunakan XAMPP di Mac OS X, dan solusi Brian Lowe di atas bekerja dengan sedikit modifikasi .

File mysql.sock sebenarnya ada di folder "/ Applications / xampp / xamppfiles / var / mysql /". Jadi harus menghubungkannya baik di / tmp dan / var / mysql. Saya belum memeriksa yang mana yang digunakan oleh baris perintah PHP, tapi ini sudah diperbaiki, jadi saya senang :-)

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
Nirav Mehta
sumber
1
ty - Saya mencari beberapa hari untuk solusi dan inilah yang akhirnya memperbaiki keadaan! =) XAMPP pada OS X juga
ljubiccica
10

Mac OS X EL Capitan + MAMP Pro Lakukan ini

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

Lalu lakukan ini

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

Semoga ini menghemat waktu Anda.

Jsonras
sumber
Ini menghubungkan mysql.dockdi /tmpyang menyelesaikannya. Terima kasih!
Mohammed J. Razem
6

Alasannya adalah bahwa php tidak dapat menemukan jalur yang benar mysql.sock.

Pastikan mysql Anda berjalan terlebih dahulu.

Kemudian, harap konfirmasikan bahwa jalur mana yang mysql.sockberada, misalnya/tmp/mysql.sock

kemudian tambahkan string path ini ke php.ini:

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

Akhirnya, restart Apache.

brucenan
sumber
6

Saat Anda menghadapi masalah berikut:

Kesalahan melempar PHP "Peringatan: mysql_connect () http: //function.mysql-connect : 2002 Tidak ada file atau direktori seperti itu (mencoba terhubung melalui unix: ///tmp/mysql.sock)"

Tetapkan nilai "mysql.default_socket" di /etc/php.iniuntuk

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

Kemudian mulai kembali layanan web di admin server

kristen
sumber
Ini adalah jawaban terbaik bagi saya - dalam kasus saya, saya menggunakan MAMP, saya menambahkan ke php.ini: mysqli.default_socket = /Applications/MAMP/tmp/mysql/mysql/sock mysql.default_socket = / Applications / MAMP / tmp /mysql/mysql.sock
Adamski
1

Solusi lain adalah memperbaiki lokasi soket di file konfigurasi php.ini seperti ini:

pdo_mysql.default_socket=/tmp/mysql.sock

Tentu saja, symlink berfungsi juga, jadi ini masalah preferensi mana yang Anda ubah.

Michael Böckling
sumber
1

Ketika Anda menginstal php53-mysql menggunakan port, ia mengembalikan pesan berikut yang merupakan solusi untuk masalah ini:

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
Sheric
sumber
Saya menggunakan Mountain Lion dan telah menginstal MySQL menggunakan macports.
Sheric
1

Saya mengalami masalah yang sama

[PDOException] SQLSTATE [HY000] [2002] Tidak ada file atau direktori tersebut

[ErrorException] Peringatan: PDO :: __ construct (): [2002] Tidak ada file atau direktori tersebut (mencoba untuk terhubung melalui unix: ///var/mysql/mysql.sock) di… htdocs / Symfony / vendor / doctrine-dbal / lib / Doctrine / DBAL / Driver / PDOConnection.php

Jadi solusinya adalah membuat symlink ke file sock sehingga menyelesaikan masalah. Lakukan hal berikut untuk mengatasinya:

$ sudo mkdir / private / var / mysql /

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

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

tanveer ahmad dar
sumber
Posting jawaban Anda di sini, daripada tautan ke situs web eksternal.
ElmerCat
0

Saya mendapat kesalahan yang sama. Mysql dijalankan sebagai aplikasi mandiri sebelum saya memulai phpMyAdmin.

Saya baru saja menghentikan mysql Kemudian sudo / Aplikasi / XAMPP / xamppfiles / xampp stop sudo / Aplikasi / XAMPP / xamppfiles / xampp start

Itu bekerja dengan baik

minhas23
sumber
0

Saya baru saja mengalami masalah ini, tetapi hanya muncul saat memuat halaman tertentu (halaman lain berfungsi dengan baik). Ternyata saya melakukan panggilan ke MySQL setelah saya menutup koneksi dengan mysql_close(). Jadi, seperti yang dikatakan @brucenan: pastikan MySQL berjalan saat Anda menyebutnya .

RoberRM
sumber
0

Anda dapat melakukannya dengan hanya mengaktifkan php MAMP di terminal Apple:

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

Contoh: > phpmamp - v

Sekarang Anda dapat menjalankan sesuatu seperti: > phpmamp scriptname.php

Catatan: Ini hanya akan diterapkan untuk sesi terminal saat ini.

Naresh Chennuri
sumber
0

Karena Anda mungkin menggunakan MAMP, ubah Port Anda ke default 3306 atau gunakan 127.0.0.1 di 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
);

Atau dengan pengaturan default:

$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
    );
Cyber
sumber
0

Klien mySQL secara default mencoba untuk terhubung melalui file lokal yang disebut socket daripada menghubungkan ke alamat loopback (127.0.0.1) untuk localhost.

Lokasi default file soket ini, setidaknya pada OSX, adalah /tmp/mysql.sock.

SOLUSI CEPAT, KURANG ELEGAN

Buat symlink untuk mengelabui OS agar menemukan soket yang benar.

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

SOLUSI PROPER

Ubah jalur soket yang ditentukan dalam startMysql.shfile dalam /Applications/MAMP/bin.

seekor hiu
sumber