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

224

Я пытаюсь подключиться к моей базе данных MySQL с помощью терминала на своем Apple (с PHP).

Вчера он работал нормально, и теперь я неожиданно получил ошибку в названии.

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

Вот файл, который я включаю для подключения (script работает, когда я не включаю это, но потом он не подключается к БД):

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

Это должно работать, поскольку оно работает с моим браузером.

Команда, которую я использую в терминале, PHP скриптname.php.

Теги:
database

16 ответов

409

По какой-то причине 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.

  • 0
    Хороший ответ. Фикс сработал для меня. Вы знаете, почему это может сработать один раз, а потом снова не сработать? У меня была та же проблема.
  • 13
    Это довольно глупо. Я очень рекомендую ответ @luismreis, чтобы обойти этот скрытый ярлык MySQL.
Показать ещё 11 комментариев
357

У меня также была эта ошибка, но я мог исправить ее только через предложение здесь.

Подводя итог, используйте:

127.0.0.1

Вместо:

localhost

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

  • 1
    Если это работает, то проверьте файл hosts , он может отсутствовать или испортиться
  • 3
    также может быть полезно упомянуть: при использовании MAMP, как я, вы должны снять флажок «Разрешить только локальный доступ»
Показать ещё 8 комментариев
23

У меня была такая же проблема, и я исправил ее:

У меня было это, и это не сработало:

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

Я сделал это, и это сработало:

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

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

  • 0
    Это единственное решение, которое сработало и для меня. У меня нет /var/mysql/mysql.sock. И у меня нет /tmp/mysql.sock.
  • 0
    вы пробовали 127.0.0.1 вместо localhost?
20

Сокет MySQL находится, в общем, в /tmp/mysql.sock или /var/mysql/mysql.sock, но, вероятно, PHP выглядит не в том месте.

  • Проверьте, где находится ваш сокет:

     sudo /usr/libexec/locate.updatedb
    
  • Когда updateb завершается:

     locate mysql.sock
    
  • Затем найдите свой 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
    
  • Отредактируйте php.ini

     sudo vim /opt/local/etc/php54/php.ini
    
  • Измените строки:

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

    где/tmp/mysql.sock - это путь к вашему сокету.

  • Сохраните ваши изменения и выйдите из ESC + SHIFT: x

  • Перезапуск Apache

     sudo apachectl stop
     sudo apachectl start
    
  • 0
    У меня нет php.ini; У меня есть только php.ini.default, так что кажется, что обходной путь здесь необходим: apple.stackexchange.com/questions/65802/… Однако он не сработал для меня.
  • 0
    @ user124384 Ваша установка, вероятно, не работает: переименуйте ваш php.ini.default в php.ini .
Показать ещё 1 комментарий
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
    Ты - я искал решение несколько дней, и это то, что, наконец, сделало все правильно! =) XAMPP на OS X тоже
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

Надеюсь, это сэкономит вам некоторое время.

  • 0
    Это связывает 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.ini до

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

Затем перезапустите веб-службу в сервере admin

  • 0
    Это был лучший ответ для меня - в моем случае я использую MAMP, я добавил в свой php.ini: mysqli.default_socket = /Applications/MAMP/tmp/mysql/mysql.sock mysql.default_socket = / Applications / MAMP / tmp /mysql/mysql.sock
2

Исправить нависшую ошибку сокета 2002 года, которая связывает место, где MySQL помещает сокет и где OSX думает, что он должен быть, MySQL ставит его в /tmp, а OSX ищет его в /var/mysql, сокет - это тип файла, который позволяет общаться с клиентом и сервером 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

У меня была такая же проблема

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

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

Таким образом, решение состоит в том, чтобы сделать символическую ссылку на файл sock, тем самым разрешив проблему. Для его устранения выполните следующие действия:

$sudo mkdir/private/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-while-browser-works-fine/

  • 0
    Разместите здесь свой ответ, а не ссылку на внешний сайт.
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 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
  • 0
    Я использую Mountain Lion и установил MySQL, используя macports.
1

Другим решением является исправление местоположения сокета в файле конфигурации php.ini следующим образом:

pdo_mysql.default_socket=/tmp/mysql.sock

Конечно, символическая ссылка тоже работает, поэтому ее предпочтение зависит от того, что вы меняете.

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

Вы можете сделать это, просто наложив MAMP php на терминал Apple:

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

Пример: > phpmamp - v

Теперь вы можете запускать что-то вроде: > phpmamp scriptname.php

Примечание. Это будет применяться только для текущего сеанса терминала.

0

У меня была эта проблема, но она появилась только при загрузке определенных страниц (другие страницы работали нормально). Оказалось, что я звонил в MySQL после того, как я закрыл соединение с mysql_close(). Итак, как сказал @brucenan: убедитесь, что MySQL работает, когда вы вызываете его.

0

У меня были те же ошибки. Mysql запускался как отдельное приложение, прежде чем я начал phpMyAdmin.

Я просто остановил mysql затем sudo/Приложения/XAMPP/xamppfiles/xampp stop sudo/Приложения/XAMPP/xamppfiles/xampp start

Он отлично работал

Ещё вопросы

Сообщество Overcoder
Наверх
Меню