Попередження: mysql_connect (): [2002] Немає такого файлу чи каталогу (намагається підключитися через unix: ///tmp/mysql.sock) в


246

Я намагаюся підключитися до моєї бази даних MySQL з терміналом на моєму Apple (З PHP).

Вчора це працювало чудово, а тепер я раптом отримую помилку в назві.

Сценарій працює, коли я використовую свій браузер для його запуску (у мене встановлений XAMPP), але термінал відмовляється підключитися до БД.

Ось файл, який я включаю для підключення (сценарій працює, коли я не включаю це, але тоді він не підключається до БД):

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

Це повинно працювати, оскільки воно працює з моїм браузером.

Команда, яку я використовую на Терміналі, - це php scriptname.php.

Відповіді:


415

З якихось причин mysql на OS X трохи неправильно розташував потрібний файл сокета, але, на щастя, рішення настільки ж просто, як і встановлення символічного посилання.

У вас може бути сокет (виглядає як файл нульової довжини) як /tmp/mysql.sockабо /var/mysql/mysql.sock, але одне або кілька додатків шукає його в іншому місці. Дізнайтеся за допомогою цієї команди:

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

Замість того, щоб переміщувати сокет, редагувати конфігураційні файли та пам’ятати, щоб відредаговані файли зберігалися локально та далеко від серверів, де шляхи є правильними, просто створіть символічне посилання, щоб ваш Mac знаходив потрібний сокет, навіть коли він шукає в неправильному місці !

Якщо у вас є, /tmp/mysql.sockале ні /var/mysql/mysql.sockтоді ...

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

Якщо у вас є, /var/mysql/mysql.sockале ні /tmp/mysql.sockтоді ...

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

Вам знадобляться дозволи для створення каталогу та посилань, тому просто прикріпіть наведені вище команди за допомогою sudo.


Хороша відповідь. Фікс працював на мене. Чи знаєте ви, чому це може працювати один раз, а потім знову не працювати? У мене була та сама проблема.
Ніколь

16
Це досить хакі. Я настійно рекомендую відповідь @luismreis для вирішення цієї прихованої ярлика MySQL.
MattiSG

2
Не працювали для мене ... Я не мав жодного з цих файлів. Але відповідь luismreis спрацювала!
Грегуар

4
Це не "хакі". Це правильний спосіб змусити роботу localhostсокета, і це може бути важливо, якщо ви не хочете зайвих накладних витрат від відправлення пакетів до маршрутизатора до доступу до бази даних.
Кебман

1
Шлях на моєму Ubuntu 10.04 був неправильним. Мені довелося це зробити: cd /tmpі тоді : sudo ln -s /var/run/mysqld/mysqld.sock mysql.sock.
franzlorenzon

371

У мене теж була ця помилка, але її можна було виправити лише через пропозицію тут .

Для підведення підсумків використовуйте:

127.0.0.1

Замість:

localhost

Причина полягає в тому, що "localhost" - це спеціальне ім'я драйвера MySQL, завдяки якому він використовує сокет UNIX для підключення до MySQL замість сокета TCP.


1
Якщо це працює, то перевірте свій hostsфайл, він може бути відсутній або зіпсований
Fabrizio

3
також, можливо, добре згадати: Коли ви використовуєте MAMP, як я, вам потрібно зняти прапорець "Дозволити лише місцевий доступ"
судівник

Це рішення робить додаткові накладні витрати, оскільки пакет спочатку відправляє маршрутизатор. Зазвичай не є великою проблемою під час тестування, але це може стати проблемою з великими пакетами даних.
Кебман

3
@Fabrizio Ні, це не пов'язано. Коли ви використовуєте localhost в якості імені, mysql використовуватиме сокет Unix замість цього, який обробляється за допомогою файлу (наприклад, mysql.sock), а не Inet, незалежно від того, місцевий хост оголошений у / etc / hosts чи ні. Однак, якщо ви використовуєте натомість ip-адресу, навіть 127.0.0.1, ви змушуєте mysql відкривати сокет Inet.
Fran Marzoa

1
Чи означає це, що всі гранти, які ви надали на MySQL db на 'user'% 'localhost', будуть порушені?
Восьминіг

24

У мене була така ж проблема, і ось як я її вирішив:

У мене це було, і це не спрацювало:

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

Я це зробив, і це спрацювало:

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

Замість використання сервера mysql я підключився безпосередньо до Unix Socket. Працювали для мене.


Це єдине рішення, яке працювало і для мене. У мене немає /var/mysql/mysql.sock. І у мене немає /tmp/mysql.sock.
JeffB6688

ви спробували 127.0.0.1 замість localhost?
Мантіс

21

MySQL-сокет розташований, як правило, в /tmp/mysql.sockабо /var/mysql/mysql.sock, але, ймовірно, PHP виглядає не в тому місці.

  1. Перевірте, де у вас розетка:

     sudo /usr/libexec/locate.updatedb
  2. Коли оновленийb припиняється:

     locate mysql.sock
  3. Потім знайдіть свій php.ini:

     php -i | grep php.ini

    це виведе щось подібне:

     Configuration File (php.ini) Path => /opt/local/etc/php54
     Loaded Configuration File => /opt/local/etc/php54/php.ini
  4. Відредагуйте свій php.ini

     sudo vim /opt/local/etc/php54/php.ini
  5. Змінення рядків:

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

    де /tmp/mysql.sock - шлях до сокета.

  6. Збережіть свої зміни та закрийте ESC + SHIFT: x

  7. Перезапустіть Apache

     sudo apachectl stop
     sudo apachectl start

У мене немає php.ini; У мене є лише php.ini.default, тож видається, що тут потрібно вирішити : apple.stackexchange.com/questions/65802/… Однак це не спрацювало для мене.
користувач124384

@ User124384 Ваша установка зіпсований: перейменовувати php.ini.defaultTo php.ini.
іменник

Apache можна перезапустити одним рядком:sudo apachectl restart
fbiazi

11

Я на XAMPP на Mac OS X, і рішення Брайана Лоу вище працював з невеликою модифікацією .

Файл mysql.sock фактично знаходиться в папці "/ Applications / xampp / xamppfiles / var / mysql /". Тому довелося пов’язати це як у / tmp, так і / var / mysql. Я не перевірив, який з них використовується командним рядком PHP, але це зробило виправлення, тому я радий :-)

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 - Я кілька днів шукав рішення, і саме це нарешті все зробило правильно! =) XAMPP на OS X теж
ljubiccica

10

Mac OS X EL Capitan + MAMP Pro Зробіть це

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

Потім зробіть це

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

Сподіваюсь, це заощадить певний час.


Це посилання на mysql.dockте, /tmpщо вирішило це. Дякую!
Мохаммед Дж. Разем

6

Причина в тому, що php не може знайти правильний шлях mysql.sock.

Переконайтесь, що ваш mysql працює першим.

Потім, будь ласка, підтвердьте, який шлях mysql.sockзнаходиться, наприклад/tmp/mysql.sock

потім додайте цей рядок шляху до php.ini:

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

Нарешті, перезапустіть Apache.


6

Коли ви стикаєтеся з таким питанням:

Помилка кидання PHP "Попередження: mysql_connect () http: //function.mysql-connect : 2002 Немає такого файлу чи каталогу (намагається підключитися через unix: ///tmp/mysql.sock)"

Задана «mysql.default_socket» в вашому /etc/php.iniTo

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

Потім перезапустіть веб-службу в адміністраторі сервера


Це була найкраща відповідь для мене - у моєму випадку я використовую MAMP, я додав до свого php.ini: mysqli.default_socket = /Applications/MAMP/tmp/mysql/mysql.sock mysql.default_socket = / Applications / MAMP / tmp /mysql/mysql.sock
Adamski

3

Виправте помилку сокету, що насувається, 2002 - це посилання, де MySQL розміщує сокет і де OSX вважає, що це має бути, MySQL ставить його в / tmp, а OSX шукає його в / var / mysql. / сервер зв'язку.

sudo mkdir /var/mysql

і потім

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

джерело: http://coolestguidesontheplanet.com/get-apache-mysql-php-phpmyadmin-working-osx-10-10-yosemite/


1

Іншим рішенням є виправити розташування сокета у файлі конфігурації php.ini таким чином:

pdo_mysql.default_socket=/tmp/mysql.sock

Звичайно, символьна посилання також працює, тому питання, яке саме ви будете змінювати, є питанням переваги.


1

Коли ви встановлюєте php53-mysql через порт, він повертає таке повідомлення, яке є вирішенням цієї проблеми:

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

Я використовую Mountain Lion і встановив MySQL за допомогою macports.
Шерик

1

у мене було те саме питання

[PDOException] SQLSTATE [HY000] [2002] Немає такого файлу чи каталогу

[ErrorException] Попередження: PDO :: __ construct (): [2002] Немає такого файлу чи каталогу (намагається підключитися через unix: ///var/mysql/mysql.sock) у… htdocs / Symfony / vendor / doctrine-dbal / lib / Доктрина / DBAL / Драйвер / PDOConnection.php

Таким чином, рішення полягає в тому, щоб зробити символьне посилання на файл шкарпетки, тим самим вирішивши проблему. Виконайте наступне, щоб вирішити це:

$ sudo mkdir / приватний / var / mysql /

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

джерело: http://www.reecefowell.com/2012/07/21/symfony2-cli-does-not-connect-to-mysql-time-browser-works-fine/


Опублікуйте свою відповідь тут, а не посилання на зовнішній веб-сайт.
ElmerCat

0

У мене були ті ж помилки. Перед запуском phpMyAdmin, Mysql працював як окремий додаток.

Я щойно зупинив mysql Тоді sudo / Програми / XAMPP / xamppfiles / xampp stop sudo / Програми / XAMPP / xamppfiles / xampp start

Це добре працювало


0

У мене просто була ця проблема, але вона з’явилася лише при завантаженні певних сторінок (інші сторінки справно працювали). Виявилося, що я телефонував до MySQL після того, як закрив зв’язок із mysql_close(). Отже, як сказав @brucenan: переконайтеся, що MySQL працює під час його виклику .


0

Зробити це можна, просто зв'язавши php MAMP на терміналі Apple:

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

Приклад: > phpmamp - v

Тепер ви можете запустити щось на кшталт: > phpmamp scriptname.php

Примітка. Це застосовуватиметься лише для поточного сеансу терміналу.


0

Оскільки ви можете використовувати MAMP, або змініть порт на типовий 3306 або використовуйте 127.0.0.1 у 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
);

Або з налаштуваннями за замовчуванням:

$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

Клієнт mySQL за замовчуванням намагається підключитися через локальний файл під назвою socket замість з'єднання з адресою петлі (127.0.0.1) для localhost.

Типовим місцем цього файлу сокетів, принаймні на OSX, є /tmp/mysql.sock .

ШВИДКИЙ, МЕЖЕ ЕЛЕГАНТНИЙ РІШЕННЯ

Створіть символьне посилання, щоб обдурити ОС у пошуку правильного сокета.

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

ВЛАСНЕ РІШЕННЯ

Змініть шлях сокета, визначений у startMysql.shфайлі в /Applications/MAMP/bin.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.