Я пытаюсь настроить 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
.
Это, вероятно, означает, что у меня что-то не так в настройках моих хостов, но это быстрое решение заставит меня идти прямо сейчас.
code
127.0.0.1 localhost code
. Что делает меня любопытным, почему не работает соединение через localhost. Если бы кто-то мог просветить меня, я был бы счастлив.
Это для Mac OS X с собственной установкой Apache HTTP и пользовательской установкой MySQL.
Ответ основан на отличном ответе @alec-gorge, но поскольку мне пришлось учесть некоторые конкретные изменения, которые были настроены в моей конфигурации, в основном Mac OS X-specific, я думал, что добавлю это ради меня полноты.
Убедитесь, что поддержка PHP5 включена в /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
Когда 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:
- файл сокета, который вы должны использовать в php.ini
.
Другой способ (некоторые говорят проще) определить местоположение имени файла сокета, выполнив вход в MySQL и выполнив:
show variables like '%socket%';
Говоря о 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_connect
, что является реальной проблемой исходного вопроса, а не общее заблуждение об установке программного обеспечения.
Помогло заменить "localhost" на "127.0.0.1" в файле конфигурации (соединение db)
Во-первых, убедитесь, что MySQL запущен. Команда: mysqld start
Если вы все еще не можете подключиться, выполните следующие действия: Как выглядит ваш /etc/my.cnf?
Другие 2 сообщения верны в том, что вам нужно проверить свой сокет, потому что 2002 - ошибка сокета.
Большой учебник по настройке LAMP: http://library.linode.com/lamp-guides/centos-5.3/index-print
/usr/local/mysql/mysql-test/include/default_my.cnf
Должен ли я скопировать его как my.cnf в /etc
?
Расширение на Ответ 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.
в моем случае у меня проблема с mysqli_connect.
когда я хочу подключиться mysqli_connect('localhost', 'myuser','mypassword')
mysqli_connect_error() возвращает мне эту ошибку "Нет такого файла или каталога"
это сработало для меня
mysqli_connect('localhost:3306', 'myuser','mypassword')
Не то, чтобы это вам очень помогло, но в последние версии (и даже менее недавний) MySQL, код ошибки 2002 означает "Не удается подключиться к локальному серверу MySQL через сокет [имя-из-сокета]", так что вы можете сказать немного больше.
Я проверил бы ваш файл php.ini и проверил бы правильность настройки mysql.default_socket, а также проверит правильность настройки вашего mysqld с файлом сокета, к которому он может получить доступ. Типичным значением по умолчанию является "/tmp/mysql.sock".
/var/mysql/mysql.sock
, но этот путь не существует.
Перезапуск сервера MySQL может помочь. В моем случае перезапуск сервера сэкономил много времени.
service mysql restart
PS - используйте sudo service mysql restart
для пользователя без полномочий root.
Я тоже столкнулся с этой проблемой, затем изменил "localhost" на "127.0.0.1", он работает.
Ошибка 2002 означает, что MySQL не может подключиться к локальному серверу базы данных через файл сокета (например, /tmp/mysql.sock
).
Чтобы узнать, где находится ваш файл сокета, запустите:
mysql_config --socket
затем дважды проверьте, что ваше приложение использует правый файл сокета Unix или подключается через порт TCP/IP.
Затем дважды проверьте, имеет ли ваш PHP правильную настройку сокетов MySQL:
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
).
Смотрите: Устранение неполадок Проблемы с подключением к 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.show_exception_trace=1
в xdebug.ini
sudo dtruss -fn mysqld
, отладить Linux с помощью strace
stat $(mysql_config --socket)
и если у вас достаточно свободного места (df -h
).net.core.somaxconn
.Убедитесь, что ваш локальный сервер (MAMP, XAMPP, WAMP и т.д.) запущен.
Я установил MySQL с помощью установщика. Фактически, не было никакого каталога данных рядом с каталогом 'bin'.
Итак, я вручную создал каталог "data" в папке "C:\Program Files\MySQL\MySQL Server 8.0". И это сработало (сменив пароль root, следуя инструкциям на https://dev.mysql.com/doc/mysql-windows-excerpt/5.7/en/resetting-permissions-windows.html.
У меня такая же проблема. Мой сокет был в конце концов найден в /tmp/mysql.sock. Затем я добавил этот путь к php.ini. Я нашел сокет от проверки страницы "Состояние сервера" в MySQL Workbench. Если ваш сокет не находится в /tmp/mysql.sock, то, возможно, MySQL Workbench мог бы сказать вам, где он находится? (Конечно, вы используете MySQL Workbench...)
Я использую PHP-FPM или несколько версий PHP на моем сервере. В моем случае я обновляю значение mysqli, так как нет параметра сокета по умолчанию для mysql:
mysqli.default_socket
к:
mysql.default_socket = /path/to/mysql.sock
благодаря @Alec Gorge
На Mac, прежде чем выполнять всю тяжелую работу, просто проверьте свои настройки в System Preferences > MySQL
. Чаще всего я столкнулся с этой проблемой, так как The MySQL Server Instance is stopped
.
Нажмите кнопку Start MySQL Server
, и произойдет волшебство.
У меня была аналогичная проблема.
В основном здесь проблема: есть, вероятно, два экземпляра mysql.
A) Один работает на /etc/init.d
B) Лампа устанавливается в /opt/lamp
Решение:
Шаг 1: - Найти все запущенные экземпляры mysql с помощью commnad "find/| grep mysqld"
Шаг 2: - Завершение работы служб, запущенных на /etc/init.d, с помощью службы mysql stop
Шаг 3: - Перезапустите ваши лампы с использованием/opt/перезапуск лампы/лампы
Вам должно быть хорошо идти:)
/etc/init.d/mysql start
если вы используете базовый дистрибутив Debian. если не удалось, проверьте файл/etc/my.cnf
предмет правильного пути к файлу сокета mysql.