Ошибка при подключении к MySQL с использованием PHP/PDO

Вчера мой код работал нормально, а сегодня вдруг просто не хочет подключаться к моей базе данных. Я не изменил никаких настроек ни в нем, ни в коде, и я не обновил ни одно программное обеспечение. Все, что я делаю, это:

new PDO('mysql:host=localhost;port=3306;dbname=test', 'username', 'password');

И я получаю хорошее сообщение об исключении, говорящее это:

Warning: PDO::__construct(): [2002] No such file or directory (trying to connect via unix:///tmp/mysql.sock) in ...

Дело в том, что я явно не пытаюсь подключиться через сокет Unix, а использую TCP/IP. Что я делаю неправильно? Есть что-то, чего я здесь не хватает?

Спасибо за любую помощь.

5 ответов

Решение

Вы используете сокет Unix. При чтении "localhost" клиентские библиотеки MySQL не интерпретируют его как TCP-хост "localhost" и разрешают это имя, а используют местоположение Socket по умолчанию. Для использования TCP на локальной машине вы должны использовать 127.0.0.1 как имя хоста.

Чтобы указать прошлое использования unix_socketвместо host в ДСН. Расположение розетки, используемой для localhost может быть определен во время компиляции или в некоторых версиях PHP, используя pdo_mysql.default_socket в php.ini,

Из документации PHP о подключении к MySQL с использованием PDO: PDO_MYSQL DNS

В записке в самом конце написано:

Только для Unix:

Если для имени хоста задано значение "localhost", то подключение к серверу осуществляется через доменный сокет. Если PDO_MYSQL скомпилирован с libmysql, то местоположение файла сокета находится в скомпилированном месте libmysql. Если PDO_MYSQL скомпилирован с mysqlnd, сокет по умолчанию может быть установлен через параметр pdo_mysql.default_socket.

Таким образом, чтобы это исправить, вы должны правильно настроить в php.ini расположение вашего mysql.sock

  1. Найдите свой файл mysql.sock. Общие места:

    • /tmp/mysql.sock
    • /tmp/mysql/mysql.sock
    • /var/mysql/mysql.sock
    • или если вы используете MAMP или LAMP, ищите в папке tmp для mysql
  2. Отредактируйте ваш файл php.ini и правильно установите значение для pdo_mysql.default_socket

  3. Перезапустите сервер Apache, чтобы получить изменения в файле php.ini.

В Ubuntu вы можете использовать этот параметр в php.ini

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

Я только добавил эту строку:

'unix_socket'   => '/Applications/XAMPP/xamppfiles/var/mysql/mysql.sock',

и все было хорошо.

Есть обновление к документам для Drush, которое задокументировано здесь.

Другие вопросы по тегам