PHP – соединение MySQL не работает: 2002 Нет такого файла или каталога

Я пытаюсь настроить WordPress. У меня работает Apache и MySQL, и все учетные записи и база данных настроены. Я попытался сделать простую связь:

<?php $conn = mysql_connect('localhost', 'USER', 'PASSWORD'); if(!$conn) { echo 'Error: ' . mysql_errno() . ' - ' . mysql_error(); } ?> 

И я всегда получаю это:

Ошибка: 2002 – Нет такого файла или каталога

О каком файле или каталоге можно говорить?

Я нахожусь в OS X Snow Leopard, используя встроенный Apache. Я установил MySQL с помощью x86_64 dmg.

UPDATE: я обнаружил, что сокет находится в /tmp/mysql.sock, поэтому в php.ini я заменил все вхождения неправильного пути на это.

Если вы используете Linux: путь к файлу mysql.sock неверен. Обычно это происходит потому, что вы используете (LAMPP) XAMPP и не находитесь в /tmp/mysql.sock

Откройте файл php.ini и найдите эту строку:

 mysql.default_socket 

И сделай это

 mysql.default_socket = /path/to/mysql.sock 

У меня была аналогичная проблема, и я смог решить ее, обратившись к mysql с 127.0.0.1 вместо localhost .

Вероятно, это означает, что у меня что-то не так в настройках моих хостов, но сейчас это быстро исправить.

Это для Mac OS X с собственной установкой Apache HTTP и пользовательской установкой MySQL .

Ответ основан на отличном ответе @ alec-gorge, но, поскольку мне пришлось учесть некоторые конкретные изменения, которые были настроены в моей конфигурации, в основном для Mac OS X, я думал, что добавлю его здесь для полноты.

Включить поддержку PHP5 для Apache HTTP

Убедитесь, что поддержка PHP5 включена в /etc/apache2/httpd.conf .

Отредактируйте файл с помощью sudo vi /etc/apache2/httpd.conf (введите пароль по sudo vi /etc/apache2/httpd.conf ) и раскомментируйте (удалите из начала) строку для загрузки модуля php5_module .

 LoadModule php5_module libexec/apache2/libphp5.so 

Запустите Apache HTTP с sudo apachectl start (или restart если он уже запущен и его необходимо перезапустить, чтобы перечитать файл конфигурации).

Убедитесь, что /var/log/apache2/error_log содержит строку, сообщающую вам, что php5_module включен – вы должны увидеть PHP/5.3.15 (или подобное).

 [notice] Apache/2.2.22 (Unix) DAV/2 PHP/5.3.15 with Suhosin-Patch configured -- resuming normal operations 

Поиск имени файла Socket

Когда MySQL запущен и запущен (с ./bin/mysqld_safe ), на консоли должны быть напечатаны строки отладки, которые сообщают вам, где вы можете найти файлы журнала. Обратите внимание на имя хоста в имени файла – localhost в моем случае – это может отличаться для вашей конфигурации.

Файл, который появляется после Logging to , важен. Вот где MySQL регистрирует свою работу.

 130309 12:17:59 mysqld_safe Logging to '/Users/jacek/apps/mysql/data/localhost.err'. 130309 12:17:59 mysqld_safe Starting mysqld daemon with databases from /Users/jacek/apps/mysql/data 

Откройте файл localhost.err (опять же, ваш может быть назван по-разному), т. tail -1 /Users/jacek/apps/mysql/data/localhost.err чтобы узнать имя файла сокета – это должна быть последняя строка.

 $ tail -1 /Users/jacek/apps/mysql/data/localhost.err Version: '5.5.27' socket: '/tmp/mysql.sock' port: 3306 MySQL Community Server (GPL) 

Обратите внимание на socket: part – это файл сокета, который вы должны использовать в php.ini .

Есть другой способ (некоторые говорят проще) определить местоположение имени файла сокета, войдя в MySQL и запуская:

 show variables like '%socket%'; 

Настройка PHP5 с поддержкой MySQL – /etc/php.ini

Говоря о php.ini …

В каталоге /etc есть файл /etc/php.ini.default . Скопируйте его в /etc/php.ini .

 sudo cp /etc/php.ini.default /etc/php.ini 

Откройте /etc/php.ini и найдите mysql.default_socket .

 sudo vi /etc/php.ini 

По умолчанию mysql.default_socket является /var/mysql/mysql.sock . Вы должны изменить его на значение, которое вы отметили ранее – это был /tmp/mysql.sock в моем случае.

Замените файл /etc/php.ini чтобы отобразить имя файла сокета:

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

Окончательная проверка

Перезапустите Apache HTTP.

 sudo apachectl restart 

Проверьте журналы, если нет ошибок, связанных с PHP5. Никакие ошибки не означают, что вы закончили, и PHP5 с MySQL должен работать нормально. Congrats!

Во-первых, убедитесь, что MySQL запущен. Команда: mysqld start

Если вы все еще не можете подключиться, то: Как выглядит ваш /etc/my.cnf?

Остальные 2 сообщения верны в том, что вам нужно проверить свой сокет, потому что 2002 – ошибка сокета.

Большой учебник по настройке LAMP: http://library.linode.com/lamp-guides/centos-5.3/index-print

Я бы проверял файл php.ini и проверял правильность настройки mysql.default_socket, а также проверял правильность настройки вашего mysqld с файлом сокета, к которому он может получить доступ. Типичным значением по умолчанию является «/tmp/mysql.sock».

Не то, чтобы это вам очень помогло, но в последних версиях (и даже менее недавних ) MySQL код ошибки 2002 означает «Не удается подключиться к локальному серверу MySQL через сокет [имя-сокета]», чтобы вы могли сказать вам еще немного.

Замена «localhost» на «127.0.0.1» в файле конфигурации (соединение db) помогло!

Я тоже столкнулся с этой проблемой, тогда я изменил «localhost» на «127.0.0.1», он работает.

в моем случае у меня проблема с mysqli_connect.
когда я хочу подключиться
mysqli_connect('localhost', 'myuser','mypassword')
mysqli_connect_error () возвращает мне эту ошибку «Нет такого файла или каталога»

это сработало для меня mysqli_connect('localhost:3306', 'myuser','mypassword')

Расширившись на ответ Matthias D, я смог решить эту ошибку 2002 года как MySQL, так и MariaDB с точными путями, используя следующие команды:

Сначала получите фактический путь к сокету MySQL:

 netstat -ln | grep -o -m 1 '/.*mysql.sock' 

Затем получите путь PHP :

 php -r 'echo ini_get("mysql.default_socket") . "\n";' 

Используя вывод этих двух команд , соедините их:

 sudo ln -s /actualpath/mysql.sock /phppath/mysql.sock 

Если это возвращает No such file or directory вам просто нужно создать путь к PHP mysql.sock, например, если ваш путь был /var/mysql/mysql.sock вы запустили:

 sudo mkdir -p /var/mysql 

Затем повторите команду sudo ln .

Убедитесь, что ваш локальный сервер (MAMP, XAMPP, WAMP и т. Д.) Работает.

У меня была аналогичная проблема.
В основном здесь проблема: есть, вероятно, два экземпляра mysql.
A) Один работает на /etc/init.d
B) Лампа устанавливается в / opt / lamp
Решение :
Шаг 1: – Найти все запущенные экземпляры mysql с помощью commnad "find / \ grep mysqld"
Шаг 2: – Завершение работы служб, запущенных на /etc/init.d, с помощью службы mysql stop
Шаг 3: – Перезапустите ваши лампы с помощью / opt / перезапуск лампы / лампы

Вы должны быть хорошими, чтобы пойти 🙂

Ошибка 2002 означает, что MySQL не может подключиться к локальному серверу базы данных через файл сокета (например, /tmp/mysql.sock ).

Чтобы узнать, где находится ваш файл сокета, запустите:

 mysql_config --socket 

затем дважды проверьте, что ваше приложение использует правый файл сокета Unix или подключается через порт TCP / IP.

Затем проверьте, правильно ли настроен PHP в вашей PHP-установке:

 php -i | grep mysql.default_socket 

и убедитесь, что файл существует .

Проверьте разъем:

 mysql --socket=/var/mysql/mysql.sock 

Если сокет Unix ошибочен или не существует, вы можете его символизировать, например:

 ln -vs /Applications/MAMP/tmp/mysql/mysql.sock /var/mysql/mysql.sock 

или исправить файл конфигурации (например, php.ini ).

Чтобы протестировать соединение PDO непосредственно с PHP, вы можете запустить:

 php -r "new PDO('mysql:host=localhost;port=3306;charset=utf8;dbname=dbname', 'root', 'root');" 

Проверьте также конфигурацию между Apache и CLI (интерфейс командной строки), поскольку конфигурация может отличаться.

Возможно, сервер работает, но вы пытаетесь подключиться, используя порт TCP / IP, именованный канал или файл сокета Unix, отличный от того, на котором прослушивается сервер. Чтобы исправить это, вам нужно вызвать клиентскую программу (например, указать параметр --port ), чтобы указать номер соответствующего порта или соответствующий именованный канал или файл сокета Unix (например, --socket option).

См.: Устранение неполадок Проблемы с подключением к MySQL


Другие утилиты / команды, которые могут помочь отслеживать проблему:

  • mysql --socket=$(php -r 'echo ini_get("mysql.default_socket");')
  • netstat -ln | grep mysql
  • php -r "phpinfo();" | grep mysql
  • php -i | grep mysql
  • Используйте XDebug с xdebug.show_exception_trace=1 в xdebug.ini
  • В OS X попробуйте sudo dtruss -fn mysqld , на Linux отлаживается с strace
  • Проверьте разрешения на Unix-сокет: stat $(mysql_config --socket) и если у вас достаточно свободного места ( df -h ).
  • Перезагрузите MySQL.
  • Проверьте net.core.somaxconn .

На Mac, прежде чем выполнять всю тяжелую работу, просто проверьте свои настройки в « System Preferences > MySQL . Чаще всего я столкнулся с этой проблемой, так как The MySQL Server Instance is stopped .

Нажмите кнопку « Start MySQL Server , и произойдет волшебство.